TypeORM 同步时自动删除外键问题

TypeORM 同步时自动删除外键问题

Tags
NestJS
TypeORM
Published
Published May 10, 2023
Property

问题

配置 typeormsynchronize=true 与 mysql 的结构同步,当 mysql 中存在数据时,typeorm 会自动删除外键,导致主键数据丢失报错。

原因

查看报错信息,发现会执行 drop 语句
ALTER TABLE `article` DROP FOREIGN KEY `FK_90c4a1a751e750a943188661ec2`
此外键对应的正是 article 表中的主键 id,查看此主键代码中定义是 uuid 格式,官方仓库中有对此问题 issue → Foreign key dropped on every sync and Unique Index created,虽然有网友提供了解决方案,但是配置后未生效。
然后继续观察执行语句,发现出现问题的是 uuid 的类型的字段。
以 uuid 为关键字搜索,查到相关 issue Synchronize issue with UUID (MySQL)
顺着 pr 找到关键点
notion image
这里很明显,uuid 的长度应该 是36,而数据库里长度是 255(应该是手动在表里新增的列),所以typeorm 认为列定义发生了改变,进而进行删除重建。

解决

entity 中涉及报错外键的统一增加长度, 操作如下:
@PrimaryColumn({ generated: 'uuid', length: 36 }) id: string
如果手动修改表中字段长度为 36 ,保证两边字段定义统一性。

总结

  • 如果启用 synchronize 后,不能手动在数据库中新增列,否则导致信息不匹配会重置。
  • 如果个人项目迁移比较麻烦,可以借助工具如 Navicat 等的数据同步功能,手动校对数据结构。