奉上最新代码: 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!!!这是我坚持学习的动力,谢谢!!
看完如果还有啥不懂得,或者对我这个方法有意见得欢迎评论区留言。
觉得写的不错的可以动动小手一键三连下。