nestjs 优秀的ORM框架sequelize操作数据库

奉上最新代码: nestjs服务demo代码=》gitee地址github地址

nodejs的ORM–sequelize

笔者在使用koa2开发后端服务的时候用的ORM框架是sequelize,觉得挺好用的,也做了分享=》node从入门到放弃系列之(12)丝滑的操作数据库及表模型

具体的就不再介绍,想了解的自己点进去看看

nestjs的ORM–typeorm

nestjs推荐的是typeorm,并且在文档中也是着重介绍,同时网络上也有很多介绍。

我就简单说下我用typeorm的感受以及为啥最后确定使用sequelize。

评价typeorm

找了一篇知乎上的评价,如何评价TypeORM?
对我来说没发现啥亮眼的点,可能是之前用过别的ORM框架的原因吧!

使用感受

  • 可以从现有数据库生成模型,但无法生成对应关系,如一对一、一对多、多对一。
  • 无法自动添加创建时间、修改时间、删除时间。

由于使用typeorm是在一两周前,所以只记得这两点感受了。
第一点导致生成的模型实体不能马上用,需要手动修改,手动修改很容易出错,导致效率低下。
第二点导致在每次操作数据时后端都要手动操作相应时间,增加代码量和处理时间。

以上两点可能是因为我水平不够导致未充分开发其原有功能导致,欢迎有知道的大佬评论指导,也算是补充下这一方面的社区资料

nestjs的ORM–sequelize

原本我还打算凑合用typeorm下,但是在最后关头发现sequelize-typescript-generator(从现有数据库生成模型)扩展后我转向了sequelize。

nestjs官网对sequelize的使用文档:sequelize-integration
nestjs也开发了一个依赖 @nestjs/sequelize ,使得sequelize在nestjs里使用的更顺滑了。

从现有数据库生成模型-sequelize-typescript-generator

使用sequelize-typescript-generator扩展,生成数据库中已有的表的模型实体,相关配置。重点说下下面几个配置:

配置解释
-C, --case字段的命名规则,驼峰\下划线\其他
-m, --timestamps时候自动补充时间。这样调用时就不需要每次手动修改创建、修改、删除时间了
-a, --associations-file数据库关系配置文件路径(一对一,一对多,多对多)。
由于扩展还没像sequelize-auto那么强大会自己生成关系,所以需要自己添加关系,然后扩展读取使用

有啥自己要用的自己看下,没有的话去git提问题,不过作者好像回复的不是很积极

以我的为例,命令如下:

npx stg -D mysql -h localhost -p 3306 -d koa2_server -u root -x password -i -C camel -o ./src/db/models -c -m -a ./src/db/associations.csv

模型实体目录
在这里插入图片描述

使用自动生成的表模型

 npm install --save @nestjs/sequelize sequelize sequelize-typescript mysql2

安装完成后,我们就可以将SequelizeModule导入AppModule,表模型导入SequelizeModule

// app.module.js

import { Module, MiddlewareConsumer, NestModule } from '@nestjs/common';
import { AppController } from './app.controller';
import { AppService } from './app.service';
import { SequelizeModule } from '@nestjs/sequelize';
import * as models from '/@/db/models/index';
import { user } from '/#model/user';

// 导入所有模型
const allModels = [];
for (const key in models) {
  if (Object.prototype.hasOwnProperty.call(models, key)) {
    const element = models[key];
    allModels.push(element);
  }
}
@Module({
  imports: [
    SequelizeModule.forFeature([user]),
    SequelizeModule.forRoot({
      dialect: 'mysql',
      host: 'localhost',
      port: 3306,
      username: 'root',
      password: 'password',
      database: 'koa2_server',
      models: allModels,
      logging: true, // 关闭打印
      // autoLoadModels: true,
      // synchronize: true,
      define: {
        timestamps: true, // 是否自动创建时间字段, 默认会自动创建createdAt、updatedAt
        paranoid: true, // 是否自动创建deletedAt字段
        createdAt: 'createTime', // 重命名字段
        updatedAt: 'updateTime',
        deletedAt: 'deleteTime',
        underscored: true, // 开启下划线命名方式,默认是驼峰命名
        freezeTableName: true, // 禁止修改表名
        charset: 'utf8mb4',
      },
    }),
  ],
  controllers: [AppController],
  providers: [AppService],
})
export class AppModule {}

forRoot()里得配置不懂得可以看下这一片,里面有sequelize配置项介绍

导入后,在服务者里使用模型经常数据的操作

// app.service.ts

import { Injectable } from '@nestjs/common';
import { InjectModel } from '@nestjs/sequelize';
import { user } from '/#model/user';

@Injectable()
export class AppService {
  constructor(
    @InjectModel(user)
    private userModel: typeof user
  ) {}
  async findAll(): Promise<user[]> {
    return this.userModel.findAll();
  }
}

// app.controller.ts
import { Controller, Get, Post } from '@nestjs/common';
import { AppService } from './app.service';

@Controller()
export class AppController {
  constructor(private readonly appService: AppService) {}

  @Get()
  getHello() {
    return this.appService.findAll();
  }
}

现在我们就能在nestjs里使用sequelize了,是不是觉得很方便。
直接操作navicat操作数据库,如果有关系的变化修改下associations.csv文件,然后npm命令导出最新模型覆盖旧的,其他都没变化,是不是效率立马提高了不少。

不足

整个流程下来还是挺完美的,但是在使用过程中我也发现了写问题

  • 到处已有表模型时,由于扩展是老外写的,所以字段的中文注释会乱码,我看github上也有issues提问,但是好像还没修改
  • 由于直接使用数据库到处的表模型,所以sequelize提供的例如自动填写uuid,数据的校验啥的复杂修饰符都不能用了。如果想用就得自己修改,这样就不是全自动了,我选择放弃。让后端存数据前进行处理。
  • 别的我暂时还有想到,可能是需求简单吧!等有了再加精!!

最后看本问代码片段觉得累的,可以直接去我项目开源地址上看:nest gitee地址nest github地址

觉得项目写的不错儿的,有值得学习的地方,欢迎Star!!!这是我坚持学习的动力,谢谢!!

看完如果还有啥不懂得,或者对我这个方法有意见得欢迎评论区留言。
觉得写的不错的可以动动小手一键三连下。

  • 5
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值