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提供TypeORM和Sequelize紧密集成
对于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