在nestjs中进行typeorm cli迁移(migration)的配置

2,436 阅读2分钟

在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上的视频.