在nestjs中进行typeorm cli迁移(migration)的配置
在学习nestjs过程中发现typeorm的迁移配置十分麻烦,似乎许多方法都是旧版本的配置,无法直接使用. 花了挺长时间总算解决了这个配置问题.
db.config.ts
先创建db.config.ts, 该文件export了两个对象,其中一个对象(ormConfig)用于 nestjs 使用,另一个对象(ormConfigForCli)给 typeormcli 使用。
两个对象基本配置相同,主要是查询的entities文件不同
- ormConfig去,dist文件夹下查找entity, 因为nestjs最终运行的是打包好的entity.js文件
- 而ormConfigForCli则可以直接运行编写好的文件, 因此会在源代码中查找entity.ts文件
import { DataSource, DataSourceOptions } from 'typeorm';
// 基础配置
const baseConfig: DataSourceOptions = {
type: 'mysql',
host: 'localhost',
port: 3306,
username: 'root',
password: '123456',
database: 'test',
};
// 该对象用于 nestjs typeorm 初始化
export const ormConfig: DataSourceOptions = {
...baseConfig,
entities: ['dist/**/entities/*.entity{.js,.ts}'],
};
// 该对象 typeorm cli 迁移时使用
const ormConfigForCli: DataSourceOptions = {
...baseConfig,
entities: ['src/**/entities/*.entity{.js,.ts}'],
migrations: ['migrations/*{.js,.ts}'], // migration:run时查找的文件夹
subscribers: ['subscribers/*{.js,.ts}'],
logger: 'file',
logging: true,
};
// 实例化dataSource,用以之后cli使用
const dataSource = new DataSource(ormConfigForCli);
// 此处的dataSource需要 export default才可以使用
export default dataSource;
nestjs中配置
类似官方文档中的方式, 直接作为forRoot的参数即可. 文档
app.module.ts
import { Module } from '@nestjs/common';
import { TypeOrmModule } from '@nestjs/typeorm';
import { ormConfig } from './config/db.config';
@Module({
imports: [TypeOrmModule.forRoot(ormConfig)],
})
export class AppModule {}
package.json配置
首先需要在package.json配置脚本
"scripts": {
// ...
// 此处 -d 表示 -dataSource, 也就是db.config.ts中export的dataSource
"typeorm": "typeorm-ts-node-esm -d ./src/config/db.config.ts",
"migration:generate": "npm run typeorm -- migration:generate",
"migration:run": "npm run typeorm -- migration:run",
"migration:revert": "npm run typeorm -- migration:revert"
},
需要注意的是,新版本typeorm对于commonjs和esm有两个不同的命令,本文中使用的是esm,所以使用typeorm-ts-node-esm, commonjs可以使用typeorm-ts-node-commonjs,具体可查看文档
使用脚本进行迁移
配置完毕后,就可以使用命令行了. 该命令会将迁移的文件输出至根目录的migrations文件夹下, 并生成 <时间戳>-alert-users-table.ts 迁移文件.
npm run migration:generate .\migrations\alert-users-table
需要注意的是,migration:generate的path为必须参数, 若是忘记添加会报错:缺少 non-option 参数:传入了 0 个, 至少需要 1 个
通过migration:run命令就可以执行此次迁移了, 迁移命令是根据之前db.config.ts中的migrations选项查找迁移文件的
npm run migration:run
通过migration:revert可以撤销迁移
npm run migration:revert
文件层级结构
├─dist
├─src
│ ├─config
│ │ └─db.config.ts
│ ├─app.modules.ts
└─migrations
│ └─ 1670661241977-alert-users-table.ts
参考资料
最后是参考资料,如果上文没解决你的配置问题的话,推荐看看下面链接中youtube上的视频.