Nestjs中使用TypeORM进行数据库操作教程

在Nestjs项目中集成TypeORM时遇到几个问题:

  1. 按照官方文档配置TypeOrmModule.forRoot()后,依然无法连接数据库,日志显示"Unable to connect to the database",如何排查常见连接问题?
  2. 实体类中@OneToMany@ManyToOne关系装饰器应该如何正确配置?我的子表始终无法自动生成外键。
  3. 使用Repository进行复杂查询时,QueryBuilderfind()方法哪种更推荐?两者在性能上有明显差异吗?
  4. 迁移文件生成后,如何手动修改字段类型而不丢失数据?现有ALTER COLUMN脚本在迁移执行时报错。
  5. 生产环境下如何优化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 进行复杂查询
  • 分页:结合 skiptake 实现分页

注意:生产环境中应将 synchronize: true 关闭,使用迁移来管理数据库结构变更。

回到顶部