Skip to content

数据库

Nest 与数据库无关,这里使用官网文档中的 TypeORMmysql2

准备工作

安装依赖

shell
npm install --save @nestjs/typeorm typeorm mysql2

完成数据库配置

创建 config/database.config.ts

ts
import { TypeOrmModuleOptions } from '@nestjs/typeorm';

export default {
  type: 'mysql',
  host: 'localhost',
  port: 3306,
  username: 'root',
  password: 'abcdefg@123456',
  database: 'a-project',
  synchronize: true,
  autoLoadEntities: true,
} as TypeOrmModuleOptions;

引入

在 app.module.ts 中引入

ts
import { Module } from '@nestjs/common';
import { AppController } from './app.controller';
import { AppService } from './app.service';
import { Modules } from './modules/index.module';
import { ConfigModule } from '@nestjs/config';
import configuration from './config/configuration';
import { TypeOrmModule } from '@nestjs/typeorm';
import databaseConfig from './config/database.config'; 

@Module({
  imports: [
    Modules,
    ConfigModule.forRoot(configuration),
    TypeOrmModule.forRoot(databaseConfig), 
  ],
  controllers: [AppController],
  providers: [AppService],
})
export class AppModule {}

使用

定义实体

entities/user.entity.ts

ts

import { Entity, Column, PrimaryGeneratedColumn } from 'typeorm';

@Entity()
export class User {
  @PrimaryGeneratedColumn()
  id: number;

  @Column()
  firstName: string;

  @Column()
  lastName: string;

  @Column({ default: true })
  isActive: boolean;
}

在 user.service.ts 中使用

user.service.ts
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 | null> {
    return this.usersRepository.findOneBy({ id }); 
  }

  async remove(id: number): Promise<void> {
    await this.usersRepository.delete(id); 
  }
}

TypeOrm 事务

文档

引入

user.service.ts

ts
@Injectable()
export class UserService {
  constructor(private dataSource: DataSource) {}
}

使用

完全控制

ts
async createMany(users: User[]) {
  const queryRunner = this.dataSource.createQueryRunner();

  await queryRunner.connect();
  await queryRunner.startTransaction();
  try {
    await queryRunner.manager.save(users[0]);
    await queryRunner.manager.save(users[1]);

    await queryRunner.commitTransaction();
  } catch (err) {
    // since we have errors lets rollback the changes we made
    await queryRunner.rollbackTransaction();
  } finally {
    // you need to release a queryRunner which was manually instantiated
    await queryRunner.release();
  }
}

另外一种使用方法

ts
async createMany(users: User[]) {
  await this.dataSource.transaction(async manager => {
    await manager.save(users[0]);
    await manager.save(users[1]);
  });
}