如何在Golang GORM中防止子模型因父模型操作被删除?
GORM中外键约束实现类似Django PROTECT的方案
你需要的是阻止父模型被删除/更新(当存在关联子模型时)的约束,这在SQL标准中对应RESTRICT或NO ACTION外键行为,GORM完全支持该特性,和Django的models.PROTECT效果一致。
一、GORM原生标签实现
直接在关联字段的GORM标签中设置OnDelete:RESTRICT和OnUpdate:RESTRICT即可:
type SomeOtherStruct struct { gorm.Model ID int `gorm:"primaryKey"` // 规范字段名,GORM默认识别ID为主键 } type SomeModel struct { gorm.Model SomeOtherStructID int // 字段名符合Go规范,与关联字段对应 SomeField SomeOtherStruct `gorm:"foreignKey:SomeOtherStructID;OnDelete:RESTRICT;OnUpdate:RESTRICT"` }
RESTRICT:当尝试删除/更新父模型时,若存在关联的子模型,数据库会直接抛出约束错误,阻止操作执行。- 部分数据库中
NO ACTION和RESTRICT行为一致(仅检查时机略有差异),也可以替换使用,效果相同。
二、原生SQL兜底实现
如果需要更精确控制外键约束,也可以通过原生SQL手动创建约束,比如在GORM迁移时执行:
// 迁移后添加外键约束 db.Exec(` ALTER TABLE some_models ADD CONSTRAINT fk_some_models_some_other_struct FOREIGN KEY (some_other_struct_id) REFERENCES some_other_structs(id) ON DELETE RESTRICT ON UPDATE RESTRICT; `)
效果验证
当你尝试删除存在关联子模型的SomeOtherStruct记录时,数据库会抛出类似foreign key constraint failed的错误,GORM会将该错误返回,你可以在业务代码中捕获并提示用户“无法删除,存在关联数据”。
内容的提问来源于stack exchange,提问作者CraZyCoDer
相关产品推荐
相关产品推荐

