如何在GORM中配置Postgres外键约束使其正常生效
错误原因
- 迁移顺序错误:创建表时需先迁移被关联的
Crocodile模型,再迁移关联方CrocodileIdentity模型,否则GORM无法找到关联主表,不会自动生成外键约束 - 标签使用不规范:混用了已废弃的
sql标签和gorm标签,部分GORM版本会识别失败导致字段类型不匹配,无法创建外键 - 全局配置问题:如果GORM实例配置了
DisableForeignKeyConstraintWhenMigrating: true,会主动跳过外键约束创建
正确配置方案
1. 修正模型定义
// 先定义被关联的主表模型 type Crocodile struct { ID string `json:"id" gorm:"primaryKey;type:UUID"` Email string `json:"email" gorm:"type:varchar(255);not null"` } type CrocodileIdentity struct { Id string `gorm:"primaryKey;type:UUID"` CrocodileID string `gorm:"type:UUID"` // 外键字段类型必须和主表主键类型完全一致 // 可通过constraint自定义外键级联规则,不需要也可以省略该参数 Crocodile Crocodile `gorm:"foreignKey:CrocodileID;references:ID;constraint:OnUpdate:CASCADE,OnDelete:RESTRICT;"` }
2. 按正确顺序执行迁移
首先确认GORM初始化配置没有开启DisableForeignKeyConstraintWhenMigrating,再按照主表在前、关联表在后的顺序执行迁移:
err := db.AutoMigrate(&Crocodile{}, &CrocodileIdentity{})
3. 验证结果
迁移完成后在Postgres执行\d crocodile_identities即可查看到外键约束,此时插入不符合关联规则的数据会正常触发外键校验报错。
内容的提问来源于stack exchange,提问作者Eugene mtl
相关产品推荐
相关产品推荐

