Skip to content

typeorm使用migration:generate生成迁移失败

这篇文章主要记录下,typeorm migration:generate这个命令到底要怎么用,才能正确生成迁移文件

前言

最近在学习使用typeorm-cli进行数据库迁移,有个typeorm migration:generate命令用法,让我一直很困惑,它的具体用法。

因为在我项目里,我已经用过typeorm migration:create" command命令,再使用typeorm-ts-node-commonjs migration:generate ./migrations/update-table -d ./scripts/data-source.ts命令执行完,还是总提示No changes in database schema were found - cannot generate a migration. To create a new empty migration use "typeorm migration:create" command,并没有生成新的迁移文件。

先解释下这个命令:

  • typeorm-ts-node-commonjs migration:generate作用等同于typeorm migration:generate,只是因为我需要执行.ts类型文件,需要把typeorm命令改为typeorm-ts-node-commonjs
  • ./migrations/update-table是指生成的迁移文件存放位置。其中update-table对应的文件名将会是[时间戳]-update-table.ts格式
  • -d ./scripts/data-source.ts是指自己写的data-source.ts脚本

目录结构

bash
├── scripts/
   └── data-source.ts
├── migrations/
└── src/
    └── providers/
        └── typeorm/
            └── typeorm.modules.ts
    └── modules/
        └── user/
                └── entities/

文件准备

ts
// data-source.ts
import { join } from 'path'
import { DataSource, DataSourceOptions } from 'typeorm'
export const dataSourceOptions: DataSourceOptions = {
    type: 'postgres',
    host: 'localhost',
    port: 5432,
    username: 'xx',
    password: 'xx',
    database: 'xx',
    migrations: [join(__dirname, '../migrations/**')], // 这个对生成迁移文件有影响
    entities: [join(__dirname, '../src/modules/**/entities/*.entity.ts')], // 这个对生成迁移文件有影响
}

export default new DataSource(dataSourceOptions)
ts
// typeorm.modules.ts。nestjs里的typeorm配置。
@Module({
    imports: [
        TypeOrm.forRootAsync({
            useFactory(configService: ConfigService) {
                const mysqlConfig = {
                    type: 'postgres',
                    host: 'localhost',
                    port: 5432,
                    username: 'xx',
                    password: 'xx',
                    database: 'xx',
                    synchronize: true, // 这个对生成迁移文件没有影响
                    migrations: '../../../migrations/**', // 这个对生成迁移文件有影响。要和data-source.ts里的指向的migrations保持一致
                    autoLoadEntities: true, // 如果是自动的话,对生成迁移文件没有影响。手动配entities,如果没配置对,会有影响
                    logging: true,
                } as TypeOrmModuleOptions
                return mysqlConfig
            },
            inject: [ConfigService],
        }),
    ],
})
export class TypeOrmModule {}

migration:generate用法

假如在我例子中的migrations文件夹是空的,需要先执行下下面两个命令

bash
typeorm migration:create ./migrations/initData
typeorm-ts-node-commonjs migration:run -d ./scripts/data-source.ts

然后修改entities文件里实体类的字段,修改后执行

bash
typeorm-ts-node-commonjs migration:generate ./migrations/update-table -d ./scripts/data-source.ts

注意生成目录./migrations/update-table要跟data-source.tstypeorm.modules.ts配的migrations指向同一个地方,就能正常生成迁移文件(之前一直没生成就是因为migrations配的路径不对)。

苏ICP备20040768号