You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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下创建迁移记录表,再正常执行你的迁移逻辑,先创建domain1 schema,再创建对应业务表。

方案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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.28 21:06:03