我有两个模型,与 GORM 的文档一模一样:
type User struct {
gorm.Model
Languages []Language `gorm:"many2many:user_languages;"`
}
type Language struct {
gorm.Model
Name string
}
用户对语言有显式引用,但语言对用户没有显式引用。我正在尝试删除一种语言,但我得到:
ERROR: update or delete on table "languages" violates foreign key constraint "fk_user_languages_language" on table "user_languages" (SQLSTATE 23503)
我尝试了多种方法,包括选择删除:
db.Select(clause.Associations).Delete(&user)
并使用
Unscoped()
。绝对没有任何作用,我无法删除这个对象。我希望 GORM 能够自动处理删除关联表中正确的行。
谢谢你
出现您遇到的问题是因为 GORM 默认情况下尝试通过在“languages”和“user_languages”表之间强制执行外键约束来维护数据完整性。当您尝试直接删除“Language”对象时,GORM 检测到“user_languages”表中仍然存在关联。此外键约束可防止删除“语言”,直到删除关联为止。
删除前明确解除用户关联:
var languageToDelete Language
// ... (fetch the language)
db.Model(&languageToDelete).Association("Users").Clear() // Removes all associations
db.Delete(&languageToDelete)