SQL(Sequelize)
SQL(Sequelize)
本章仅适用于TypeScript
Sequelize是一个用vanilla JavaScript编写的流行的对象关系映射器(ORM),但是有一个sequelize-typescript TypeScript包装器,它为基本的sequelize提供了一组装饰器和其他附加功能。要使用此库启动冒险,我们必须安装以下依赖项:
$ npm install --save sequelize sequelize-typescript mysql2
$ npm install --save-dev @types/sequelize
我们需要做的第一步是创建一个Sequelize
实例,并将选项对象传递给构造函数。此外,我们需要添加所有模型(替代方法是使用modelPaths
属性)和sync()
我们的数据库表。
database.providers.ts
import { Sequelize } from 'sequelize-typescript';
import { Cat } from '../cats/cat.entity';
export const databaseProviders = [
{
provide: 'SequelizeToken',
useFactory: async () => {
const sequelize = new Sequelize{
dialect: 'mysql',
host: 'localhost',
port: 3306,
username: 'root',
password: 'password',
database: 'nest',
}
sequelize.addModels([Cat]
await sequelize.sync(
return sequelize;
},
},
];
提示
遵循最佳实践,我们在具有*.providers.ts
后缀的分隔文件中声明了自定义提供程序。
然后,我们需要导出这些提供程序,以使其可供
应用程序的其余部分访问
。
database.module.ts
import { Module } from '@nestjs/common';
import { databaseProviders } from './database.providers';
@Module{
providers: [...databaseProviders],
exports: [...databaseProviders],
})
export class DatabaseModule {}
现在我们可以Sequelize
使用@Inject()
装饰器注入对象。依赖于Sequelize
异步提供程序的每个类都将等到a Promise
被解析。
模型注射
在Sequelize中,模型
定义了数据库中的表。此类的实例表示数据库行。首先,我们至少需要一个实体:
猫/ cat.entity.ts
import { Table, Column, Model } from 'sequelize-typescript';
@Table
export class Cat extends Model<Cat> {
@Column
name: string;
@Column
age: number;
@Column
breed: string;
}
该Cat
实体属于该cats
目录。这个目录代表了CatsModule
。现在是时候创建一个Repository
组件了:
cats.providers.ts
import { Cat } from './cat.entity';
export const catsProviders = [
{
provide: 'CatsRepository',
useValue: Cat,
},
];
注意
在实际应用程序中,您应该避免使用魔术字符串
。双方CatsRepository
并SequelizeToken
应保持在分开的constants.ts
文件。
在Sequelize中,我们使用静态方法来操作数据,因此我们在这里创建了一个别名
。
现在,我们可以注入CatsRepository
的到CatsService
用的@Inject()
装饰:
cats.service.ts
import { Component, Inject } from '@nestjs/common';
import { CreateCatDto } from './dto/create-cat.dto';
import { Cat } from './cat.entity';
@Component()
export class CatsService {
constructor(
@Inject('CatsRepository') private readonly catsRepository: typeof Cat) {}
async findAll(): Promise<Cat[]> {
return await this.catsRepository.findAll<Cat>(
}
}
数据库连接是异步的
,但是Nest使这个过程对最终用户完全不可见。该CatsRepository
供应商正在等待数据库连接,并且CatsService
被延迟,直到库已准备好使用。整个应用程序可以在每个类实例化时启动。
这是一个CatsModule
:
cats.module.ts
import { Module } from '@nestjs/common';
import { CatsController } from './cats.controller';
import { CatsService } from './cats.service';
import { catsProviders } from './cats.providers';
import { DatabaseModule } from '../database/database.module';
@Module{
imports: [DatabaseModule],
controllers: [CatsController],
providers: [
CatsService,
...catsProviders,
],
})
export class CatsModule {}
提示
不要忘记将其导入CatsModule
根目录ApplicationModule
。