Nest.js + Sequelize:从零开始的数据库操作指南

什么是 Sequelize

Sequelize是一个基于承诺的Node.js ORM工具,用于PostgresMySQLMariaDBSQLiteMicrosoft SQL ServerOracle DatabaseAmazon RedshiftSnowflake的数据云。它具有可靠的事务支持、关系、急切和延迟加载、读取复制等功能。:::info简单的说: Sequelize 是一个流行的 ORM(对象关系映射)框架,它可以帮助我们轻松地与关系型数据库进行交互。 :::

安装依赖

css 复制代码
npm i --save @nestjs/sequelize sequelize-typescript sequelize  mysql2

** Sequelize 配置**

在 NestJS 应用中,我们可以通过创建一个 Sequelize 模块来配置数据库连接。

javascript 复制代码
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;
​

在 主模块导入 Sequelize 配置, 通过 SequelizeModule 并使用 forRoot 方法完成的

python 复制代码
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,我们可以定义模型来代表数据库中的表,我们可以使用装饰器来定义模型和其属性。

less 复制代码
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 了.

python 复制代码
// 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.属性 来访问使用模型了

typescript 复制代码
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 会自动创建模型, 因为我们把它注入到主模块中,并且挂载了模型。

相关推荐
光影少年19 分钟前
react状态管理都有哪些及优缺点和应用场景
前端·react.js·前端框架
saber_andlibert2 小时前
TCMalloc底层实现
java·前端·网络
逍遥德2 小时前
如何学编程之01.理论篇.如何通过阅读代码来提高自己的编程能力?
前端·后端·程序人生·重构·软件构建·代码规范
冻感糕人~2 小时前
【珍藏必备】ReAct框架实战指南:从零开始构建AI智能体,让大模型学会思考与行动
java·前端·人工智能·react.js·大模型·就业·大模型学习
程序员agions2 小时前
2026年,“配置工程师“终于死绝了
前端·程序人生
alice--小文子2 小时前
cursor-mcp工具使用
java·服务器·前端
晚霞的不甘2 小时前
揭秘 CANN 内存管理:如何让大模型在小设备上“轻装上阵”?
前端·数据库·经验分享·flutter·3d
小迷糊的学习记录2 小时前
0.1 + 0.2 不等于 0.3
前端·javascript·面试
梦帮科技3 小时前
Node.js配置生成器CLI工具开发实战
前端·人工智能·windows·前端框架·node.js·json
VT.馒头4 小时前
【力扣】2695. 包装数组
前端·javascript·算法·leetcode·职场和发展·typescript