什么是 Sequelize
Sequelize是一个基于承诺的Node.js ORM工具,用于Postgres,MySQL,MariaDB,SQLite,Microsoft SQL Server,Oracle Database,Amazon Redshift和Snowflake的数据云。它具有可靠的事务支持、关系、急切和延迟加载、读取复制等功能。:::info简单的说: Sequelize 是一个流行的 ORM(对象关系映射)框架,它可以帮助我们轻松地与关系型数据库进行交互。 :::
安装依赖
npm i --save @nestjs/sequelize sequelize-typescript sequelize mysql2
** Sequelize 配置**
在 NestJS 应用中,我们可以通过创建一个 Sequelize 模块来配置数据库连接。
import { SequelizeModuleOptions } from '@nestjs/sequelize';
const sequelizeConfig: SequelizeModuleOptions = {
dialect: 'mysql',
host: 'localhost',
port: 3306,
username: 'root',
password: '123456',
database: 'accounts',
autoLoadModels: true,
synchronize: true,
};
export default sequelizeConfig;
SequelizeModuleOptions 属性配置
- dialect: 指定要使用的数据库类型。Sequelize 支持多种数据库方言,如 'mysql','postgres','sqlite','mssql' 等。在这个例子中,使用的是 'mysql'。
- host: 数据库服务器的地址。在这个例子中,数据库服务器在本地,所以地址是 'localhost'。
- port: 数据库服务监听的端口号。对于 MySQL,通常默认端口是 3306。
- username 和 password: 用于连接数据库的凭据。在这个例子中,用户名是 'root',密码是 '123456'。
- database: 连接的数据库名称,在此案例中,名称是 'accounts'。
- autoLoadModels: 如果设置为 true,Sequelize 将自动加载所有定义的模型到数据库中。模型是一种表示数据库中表格的 JavaScript 对象。
- synchronize: 如果设置为 true,每次应用程序启动时,Sequelize 将根据模型定义同步数据库状态。这可能意味着表的创建、更新或删除。请注意,这种设置在生产环境中可能有潜在的风险,因为它可能会造成数据库的数据被错误地改动或删除。
在 主模块导入 Sequelize
配置, 通过 SequelizeModule 并使用 forRoot 方法完成的
import { Module } from '@nestjs/common';
import { AppController } from './app.controller';
import { AppService } from './app.service';
import { CostRecordModule } from './modules/cost-record/cost-record.module';
import { SequelizeModule } from '@nestjs/sequelize';
import sequelizeConfig from './config/sequelize.config'
@Module({
imports: [CostRecordModule, SequelizeModule.forRoot(sequelizeConfig),],
controllers: [AppController],
providers: [AppService],
})
export class AppModule {}
创建模型
使用 Sequelize,我们可以定义模型来代表数据库中的表,我们可以使用装饰器来定义模型和其属性。
import { Model, Column, Table, DataType, ForeignKey } from 'sequelize-typescript';
@Table
export class CostRecord extends Model {
@Column({
type: DataType.INTEGER,
primaryKey: true,
autoIncrement: true,
})
id: number; // 交易记录唯一标识符
@Column({
type: DataType.STRING,
allowNull: false,
})
type: string; // 交易类型
@Column({
type: DataType.FLOAT,
allowNull: false,
})
amount: number; // 金额
@Column({
type: DataType.STRING,
allowNull: false,
})
category: string; // 交易类别
@Column({
type: DataType.STRING,
allowNull: true,
})
description: string; // 交易描述
@Column({
type: DataType.STRING,
allowNull: false,
})
date: string; // 交易发生的日期
@Column({
type: DataType.STRING,
allowNull: true,
})
notes: string; // 详细注释
@Column({
type: DataType.STRING,
allowNull: true,
})
iconName: string; // 图标名称
@Column({
type: DataType.STRING,
allowNull: true,
})
bxStatus: string; // 报销状态
@Column({
type: DataType.STRING,
allowNull: true,
})
costId: string; // 费用记录id
// @ForeignKey(() => User)
@Column({
type: DataType.INTEGER,
allowNull: true,
})
userId: number; // 用户id,外键引用 User 模型
}
在模块中中导入模型
在我们要使用模块的 .model.ts
文件中 通过 SequelizeModule.forFeature 方法 来导入模型,这样我就可以操作模型(数据库表) CURD
了.
// cost-record.module.ts
import { Module } from '@nestjs/common';
import { CostRecordService } from './cost-record.service';
import { CostRecordController } from './cost-record.controller';
import { CostRecord } from "../../model/CostRecord.model"
import { SequelizeModule } from '@nestjs/sequelize';
@Module({
imports:[SequelizeModule.forFeature([CostRecord])],
controllers: [CostRecordController],
providers: [CostRecordService],
})
export class CostRecordModule {}
使用模型
导入模型,然后在构造器 将属性 注入到类属性上,这样我就可以直接通过this.属性
来访问使用模型了
import { Injectable } from '@nestjs/common';
import { CreateCostRecordDto } from './dto/create-cost-record.dto';
import { UpdateCostRecordDto } from './dto/update-cost-record.dto';
import { InjectModel } from '@nestjs/sequelize';
import { CostRecord } from "../../model/CostRecord.model"
@Injectable()
export class CostRecordService {
constructor(
@InjectModel(CostRecord)
private readonly costRecordModel: typeof CostRecord,
) {}
findAll() {
return this.costRecordModel.findAll();;
}
}
最后
当启动项目后,Sequelize 会自动创建模型, 因为我们把它注入到主模块中,并且挂载了模型。