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

在使用NestJS和TypeORM进行数据库操作时遇到了一些问题:

  1. 如何在NestJS中正确配置TypeORM连接数据库?按照官方文档操作后仍然出现连接失败的提示。

  2. 使用TypeORM的Repository模式进行CRUD操作时,如何优雅地处理事务?有没有完整的示例可以参考?

  3. 实体关系(如一对一、一对多)在TypeORM中如何定义?尝试关联查询时总是返回不完整或错误的数据。

  4. 有没有推荐的方式在NestJS+TypeORM项目中实现数据库迁移?每次修改实体后都需要手动同步表结构很麻烦。

  5. 生产环境下如何优化TypeORM的数据库查询性能?发现一些复杂查询响应速度很慢。


3 回复

以下是一个简单的NestJS + TypeORM数据库操作教程:

  1. 初始化项目
    使用Nest CLI创建项目:

    npm i -g [@nestjs](/user/nestjs)/cli
    nest new project-name
    cd project-name
    
  2. 安装依赖
    安装TypeORM及相关模块:

    npm install typeorm [@nestjs](/user/nestjs)/typeorm mysql2
    
  3. 配置TypeORM
    src目录下创建ormconfig.json文件:

    {
      "type": "mysql",
      "host": "localhost",
      "port": 3306,
      "username": "root",
      "password": "your-password",
      "database": "test_db",
      "entities": ["dist/**/*.entity{.ts,.js}"],
      "synchronize": true
    }
    
  4. 创建实体
    创建一个User实体:

    touch src/user/user.entity.ts
    

    内容如下:

    import { Entity, PrimaryGeneratedColumn, Column } from 'typeorm';
    
    [@Entity](/user/Entity)()
    export class User {
      @PrimaryGeneratedColumn()
      id: number;
    
      @Column()
      name: string;
    
      @Column()
      email: string;
    }
    
  5. 创建服务和控制器
    生成服务和服务模块:

    nest generate service user
    nest generate controller user
    

    实现基本的增删改查逻辑。

  6. 测试
    启动应用:

    npm run start:dev
    

通过以上步骤,你可以完成一个简单的NestJS + TypeORM数据库操作示例。建议深入学习TypeORM文档以掌握更多高级功能。


以下是一个简单的NestJS + TypeORM数据库操作教程:

  1. 初始化项目:
npm i -g @nestjs/cli
nest new project-name
cd project-name
  1. 安装依赖:
npm install typeorm pg --save
npm install @nestjs/typeorm --save

pg是PostgreSQL驱动,根据你的数据库选择对应驱动。

  1. 配置app.module.ts
import { Module } from '@nestjs/common';
import { TypeOrmModule } from '@nestjs/typeorm';

@Module({
  imports: [
    TypeOrmModule.forRoot({
      type: 'postgres',
      host: 'localhost',
      port: 5432,
      username: 'your-username',
      password: 'your-password',
      database: 'your-db',
      entities: [__dirname + '/**/*.entity{.ts,.js}'],
      synchronize: true,
    }),
  ],
})
export class AppModule {}
  1. 创建实体(Entity):
nest generate entity user
  1. 在控制器中操作数据库:
import { Controller, Get } from '@nestjs/common';
import { InjectRepository } from '@nestjs/typeorm';
import { Repository } from 'typeorm';
import { User } from './user.entity';

@Controller('users')
export class UsersController {
  constructor(
    @InjectRepository(User)
    private usersRepository: Repository<User>,
  ) {}

  @Get()
  async findAll(): Promise<User[]> {
    return this.usersRepository.find();
  }
}

运行npm run start:dev即可测试。

NestJS 结合 TypeORM 是开发后端应用的常见组合,以下是简明教程:

1. 安装依赖

npm install @nestjs/typeorm typeorm mysql2  # 根据DB选择对应驱动

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. 服务层使用

// 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();
  }

  create(user: User): Promise<User> {
    return this.usersRepository.save(user);
  }
}

5. 控制器示例

// user.controller.ts
import { Controller, Get, Post, Body } from '@nestjs/common';
import { UserService } from './user.service';
import { User } from './user.entity';

@Controller('users')
export class UserController {
  constructor(private readonly userService: UserService) {}

  @Get()
  findAll() {
    return this.userService.findAll();
  }

  @Post()
  create(@Body() user: User) {
    return this.userService.create(user);
  }
}

关键点:

  1. @Entity() 装饰器定义数据表结构
  2. @InjectRepository() 注入Repository
  3. 常用Repository方法:find/save/update/delete
  4. 生产环境关闭synchronize,使用迁移

可以进一步配置:

  • 关系(@OneToMany等)
  • 事务管理
  • 自定义Repository
  • 数据验证
回到顶部