TypeORM运行自定义schema迁移报错:migrations表创建早于schema生成
问题根因
你在TypeORM配置中全局指定了schema: 'domain1',TypeORM启动执行迁移逻辑前,会先检查并创建迁移记录表migrations,且会把这张表也放到你指定的domain1 schema下。但domain1的创建逻辑写在你的迁移脚本内部,程序此时还没有执行到迁移脚本,schema不存在,因此触发报错。
解决办法
方案1(改动最小,推荐):迁移表放在默认dbo schema,业务表仍用domain1
- 调整ORM配置,删除全局
schema: 'domain1'配置,新增migrationsTableName指定迁移表的schema为MSSQL默认存在的dbo:
return { type: 'mssql', host: '..', port: '..', username: '..', password: '..', database: '..', options: { encrypt: true, }, entities: [`${__dirname}/src/entities/*.entity{.ts,.js}`], migrations: [`${__dirname}/migrations/**/*{.ts,.js}`], migrationsRun: true, synchronize: false, logging: true, // 新增配置,指定迁移表存放在dbo schema下 migrationsTableName: 'dbo.migrations', cli: { migrationsDir: 'apps/myapp/src/migration', }, };
- 在所有业务实体的
@Entity装饰器中指定schema为domain1:
@Entity({ name: 'table1', schema: 'domain1' }) export class Table1 { // 实体字段定义 }
- 现有迁移脚本无需修改,启动后会先在
dbo下创建迁移记录表,再正常执行你的迁移逻辑,先创建domain1schema,再创建对应业务表。
方案2:迁移表也放在domain1下
如果你需要把迁移记录表也归到domain1 schema下,需要提前创建好domain1 schema,再启动TypeORM执行迁移:
- 手动在数据库执行建schema语句,同时给对应的数据库账号赋
domain1的操作权限:
IF NOT EXISTS (SELECT * FROM sys.schemas WHERE name = 'domain1') BEGIN EXEC('CREATE SCHEMA domain1') END
- 原有ORM配置和迁移脚本无需修改,直接启动即可正常执行。
注意事项
如果选择方案1,写原生SQL操作业务表时,需要带上domain1.前缀,你当前的迁移脚本已经符合要求,无需额外调整。
内容的提问来源于stack exchange,提问作者ricky32
相关产品推荐
相关产品推荐

