Nest - 操作MySQL

Nest 与数据库无关,允许您轻松地与任何 SQL 或 NoSQL 数据库集成
Nest 连接到数据库只需为数据库加载一个适当的 Node.js 驱动程序

TypeORM 是一个 ORM 框架,是一款比较成熟的对象关系映射器,它是由 typescript 写的。支持 MySQL, PostgreSQL, MariaDB, SQLite, MS SQL Server, Oracle, WebSQL 等数据库。
https://docs.nestjs.com/techniques/database

安装

Nest提供TypeORMSequelize紧密集成
对于TypeORM支持的任何数据库,只需要为所选数据库安装关联的客户端API库。
如:MySQL

npm install --save @nestjs/typeorm typeorm mysql2

TypeOrmModule 导入AppModule

app.module.ts

// forRoot() 方法支持所有TypeORM包中createConnection()函数暴露出的配置属性
import { Module } from '@nestjs/common';
import { TypeOrmModule } from '@nestjs/typeorm';

@Module({
  imports: [
    TypeOrmModule.forRoot({
      type: 'mysql',
      host: 'localhost',
      port: 3306,
      username: 'root',
      password: 'root',
      database: 'test',
      entities: [],
      synchronize: true,
    }),
  ],
})
export class AppModule {}

参数 说明
retryAttempts 重试连接数据库的次数(默认:10)
retryDelay 两次重试连接的间隔(ms)(默认:3000)
autoLoadEntities 如果为true,将自动加载实体(默认:false)
keepConnectionAlive 如果未true,在应用程序关闭后连接不会关闭(默认:false)

也可以创建 ormconfig.json,以不带任何选项地调用 forRoot()

因此每个实体都有自己的存储库(表)

1、定义一个User实体

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

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

  @Column()
  firstName: string;

  @Column()
  lastName: string;

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

2、插入entities数组中来让 TypeORM知道它的存在

import { Module } from '@nestjs/common';
import { TypeOrmModule } from '@nestjs/typeorm';
import { User } from './users/user.entity';

@Module({
  imports: [
    TypeOrmModule.forRoot({
      type: 'mysql',
      host: 'localhost',
      port: 3306,
      username: 'root',
      password: 'root',
      database: 'test',
      entities: [User],
      synchronize: true,
    }),
  ],
})
export class AppModule {}

3、使用 forFeature() 方法定义在当前范围中注册哪些存储库

user.module.ts

import { Module } from '@nestjs/common';
import { TypeOrmModule } from '@nestjs/typeorm';
import { UsersService } from './users.service';
import { UsersController } from './users.controller';
import { User } from './user.entity';

@Module({
  imports: [TypeOrmModule.forFeature([User])],
  providers: [UsersService],
  controllers: [UsersController],
})
export class UsersModule {}

4、@InjectRepository()装饰器将 UsersRepository 注入到 UsersService 中

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: string): Promise<User> {
    return this.usersRepository.findOne(id);
  }

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

5、UsersModule 导入根 AppModule

posted @ 2021-09-04 09:11  有什么奇怪  阅读(640)  评论(0编辑  收藏  举报