Nestjs中使用TypeORM进行数据库操作教程
在Nestjs项目中集成TypeORM时遇到几个问题:
- 按照官方文档配置
TypeOrmModule.forRoot()
后,依然无法连接数据库,日志显示"Unable to connect to the database",如何排查常见连接问题? - 实体类中
@OneToMany
和@ManyToOne
关系装饰器应该如何正确配置?我的子表始终无法自动生成外键。 - 使用Repository进行复杂查询时,
QueryBuilder
和find()
方法哪种更推荐?两者在性能上有明显差异吗? - 迁移文件生成后,如何手动修改字段类型而不丢失数据?现有
ALTER COLUMN
脚本在迁移执行时报错。 - 生产环境下如何优化TypeORM的数据库连接池配置?当前频繁出现连接超时警告。
3 回复
在NestJS中使用TypeORM操作数据库非常简单。首先安装必要的依赖:
npm install @nestjs/typeorm typeorm mysql2
配置app.module.ts
:
import { Module } from '@nestjs/common';
import { TypeOrmModule } from '@nestjs/typeorm';
@Module({
imports: [
TypeOrmModule.forRoot({
type: 'mysql',
host: 'localhost',
port: 3306,
username: 'root',
password: '',
database: 'test_db',
entities: [__dirname + '/**/*.entity{.ts,.js}'],
synchronize: true,
}),
],
})
export class AppModule {}
创建实体类user.entity.ts
:
import { Entity, PrimaryGeneratedColumn, Column } from 'typeorm';
@Entity()
export class User {
@PrimaryGeneratedColumn()
id: number;
@Column()
name: string;
@Column()
age: number;
}
创建服务user.service.ts
:
import { Injectable } from '@nestjs/common';
import { InjectRepository } from '@nestjs/typeorm';
import { Repository } from 'typeorm';
import { User } from './user.entity';
@Injectable()
export class UserService {
constructor(
@InjectRepository(User)
private usersRepository: Repository<User>,
) {}
findAll(): Promise<User[]> {
return this.usersRepository.find();
}
findOne(id: number): Promise<User> {
return this.usersRepository.findOneBy({ id });
}
async remove(id: number): Promise<void> {
await this.usersRepository.delete(id);
}
}
通过以上步骤,你就完成了在NestJS中使用TypeORM的基本配置和数据库操作。
在NestJS中使用TypeORM操作数据库非常方便。首先安装必要的依赖:
npm install @nestjs/typeorm typeorm mysql2 --save
然后配置app.module.ts
:
import { Module } from '@nestjs/common';
import { TypeOrmModule } from '@nestjs/typeorm';
@Module({
imports: [
TypeOrmModule.forRoot({
type: 'mysql',
host: 'localhost',
port: 3306,
username: 'root',
password: 'password',
database: 'testdb',
entities: [__dirname + '/**/*.entity{.ts,.js}'],
synchronize: true, // 开发环境可用,生产环境建议关闭
}),
],
})
export class AppModule {}
接着创建实体类和仓库。例如:
// src/user/user.entity.ts
import { Entity, PrimaryGeneratedColumn, Column } from 'typeorm';
@Entity()
export class User {
@PrimaryGeneratedColumn()
id: number;
@Column()
name: string;
@Column()
age: number;
}
然后定义服务来操作数据库:
// src/user/user.service.ts
import { Injectable } from '@nestjs/common';
import { InjectRepository } from '@nestjs/typeorm';
import { Repository } from 'typeorm';
import { User } from './user.entity';
@Injectable()
export class UserService {
constructor(
@InjectRepository(User)
private usersRepository: Repository<User>,
) {}
findAll(): Promise<User[]> {
return this.usersRepository.find();
}
findOne(id: number): Promise<User> {
return this.usersRepository.findOneBy({ id });
}
async create(user: User): Promise<User> {
return this.usersRepository.save(user);
}
async update(id: number, user: User): Promise<void> {
await this.usersRepository.update(id, user);
}
async remove(id: number): Promise<void> {
await this.usersRepository.delete(id);
}
}
这样就完成了基本的配置和使用。通过依赖注入,可以在控制器中调用这些方法完成CRUD操作。
NestJS 中使用 TypeORM 进行数据库操作指南
TypeORM 是一个优秀的 Node.js ORM 框架,与 NestJS 完美集成。下面是基本使用教程:
1. 安装依赖
npm install @nestjs/typeorm typeorm mysql2 # 如果用MySQL
2. 配置数据库连接
在 app.module.ts
中配置:
import { TypeOrmModule } from '@nestjs/typeorm';
@Module({
imports: [
TypeOrmModule.forRoot({
type: 'mysql',
host: 'localhost',
port: 3306,
username: 'root',
password: 'password',
database: 'test',
entities: [__dirname + '/**/*.entity{.ts,.js}'],
synchronize: true, // 生产环境应关闭
}),
],
})
export class AppModule {}
3. 创建实体
// user.entity.ts
import { Entity, PrimaryGeneratedColumn, Column } from 'typeorm';
@Entity()
export class User {
@PrimaryGeneratedColumn()
id: number;
@Column()
name: string;
@Column()
email: string;
}
4. 创建服务层
// users.service.ts
import { Injectable } from '@nestjs/common';
import { InjectRepository } from '@nestjs/typeorm';
import { Repository } from 'typeorm';
import { User } from './user.entity';
@Injectable()
export class UsersService {
constructor(
@InjectRepository(User)
private usersRepository: Repository<User>,
) {}
findAll(): Promise<User[]> {
return this.usersRepository.find();
}
findOne(id: number): Promise<User> {
return this.usersRepository.findOne(id);
}
async create(user: User): Promise<User> {
return this.usersRepository.save(user);
}
async remove(id: number): Promise<void> {
await this.usersRepository.delete(id);
}
}
5. 在模块中注册
// users.module.ts
import { Module } from '@nestjs/common';
import { TypeOrmModule } from '@nestjs/typeorm';
import { UsersService } from './users.service';
import { User } from './user.entity';
@Module({
imports: [TypeOrmModule.forFeature([User])],
providers: [UsersService],
exports: [UsersService],
})
export class UsersModule {}
6. 基本操作示例
// 查询所有用户
const users = await this.usersService.findAll();
// 创建用户
const newUser = new User();
newUser.name = 'John';
newUser.email = 'john@example.com';
await this.usersService.create(newUser);
// 更新用户
const user = await this.usersService.findOne(1);
user.name = 'Updated Name';
await this.usersRepository.save(user);
高级功能
- 关系:使用
@OneToMany
、@ManyToOne
等装饰器定义实体关系 - 事务:使用
@Transaction
和@TransactionManager
- 查询构建器:使用
createQueryBuilder
进行复杂查询 - 分页:结合
skip
和take
实现分页
注意:生产环境中应将 synchronize: true
关闭,使用迁移来管理数据库结构变更。