TypeORM使用enumName配置Postgres枚举时出现重复迁移问题
问题原因
- 这是TypeORM旧版本针对Postgres枚举处理的已知缺陷,核心存在两个逻辑问题:
- Postgres默认会将未包裹双引号的标识符自动转为小写存储,TypeORM从数据库元数据读取枚举名称时,拿到的是全小写的
tasknotificationtype,但你在实体中配置的enumName是驼峰格式的TaskNotificationType,框架做字段一致性比对时判断二者不匹配,就会认为枚举字段发生了变更,所以在没有实体修改的情况下也会重复生成删列再加列的迁移。 - TypeORM的迁移变更检测逻辑最初没有把
enumName配置项纳入比对范围,只会校验枚举值、字段类型等属性,所以你后续新增enumName配置时,框架识别不到变更,就会提示无schema变化无法生成迁移。
- Postgres默认会将未包裹双引号的标识符自动转为小写存储,TypeORM从数据库元数据读取枚举名称时,拿到的是全小写的
可行解决方案
- 方案1:规避式处理,自定义
enumName时统一使用全小写加下划线的蛇形命名,比如task_notification_type,和Postgres返回的元数据命名格式一致,就能避免触发重复迁移的问题。 - 方案2:手动编写迁移处理枚举重命名,如果一定要使用驼峰格式的枚举名,不要依赖自动生成迁移,手动创建空迁移文件编写变更逻辑:先将字段类型临时改为varchar,删除旧枚举,创建带双引号包裹的驼峰名新枚举,再将字段类型改回新枚举即可。
- 方案3:升级TypeORM到0.3.x及以上稳定版本,该枚举匹配缺陷在后续版本已经被修复,
enumName的大小写匹配、变更检测都可以正常工作。
内容的提问来源于stack exchange,提问作者Eranga Heshan
相关产品推荐
相关产品推荐

