【问题标题】:Cascade Delete in Gorm does not remove Associated TablesGorm 中的级联删除不会删除关联表
【发布时间】:2021-05-29 09:17:21
【问题描述】:

我是 Gorm 的新手。我正在尝试进行级联删除,如果我删除用户,与用户关联的角色(属于)、个人资料(有一个)和书籍(一对多)也将被删除。

我在下面设置了我的模型,但级联似乎不起作用。当我删除我的用户时,角色、个人资料和书籍仍然保留在数据库中,而不是被删除/软删除。

谁能指出我做错了什么?谢谢

用户模型

type User struct {
    gorm.Model
    Name string `json:"name"`
    Age uint    `json:"age"`
    Profile Profile `gorm:"constraint:OnDelete:CASCADE;"`
    RoleID int `json:"role_id"`
    Role Role `gorm:"constraint:OnDelete:CASCADE;"`
    Books []Book `gorm:"constraint:OnDelete:CASCADE;"`
}

type Book struct {
    gorm.Model
    Title string `json:"title"`
    UserID uint `json:"user_id"`
}

type Profile struct {
    gorm.Model
    Country string `json:"country"`
    UserID uint `json:"user_id"`
}

type Role struct {
    ID int
    Name string `json:"name"`
}

【问题讨论】:

    标签: go-gorm


    【解决方案1】:

    当使用gorm.Model 时,或者更具体地说,当您的模型具有gorm.DeletedAt 类型的字段时,GORM 使用soft delete。也就是说,记录实际上并没有被删除,只有上述字段被更新,并且记录通常被排除在查询结果之外。因此,级联删除不会触发。

    您可以使用Unscoped 方法找到,然后实际上删除软删除的对象。或者,更改您的模型,使其不受软删除的影响。

    【讨论】:

    • 我注意到角色的级联删除在删除用户时不会生效,这与个人资料和书籍不同。仔细想想,这很好,因为角色仍然存在是有意义的。但是,当它似乎根本不起作用时,为什么它会成为属于关联的级联删除的这样一个选项?还是以不同的方式工作?
    • 它确实有效。如果您删除一个角色,属于它的所有用户都将被删除。看一下 GORM 创建的表 schema,Role 的外键约束在 User 表上。
    猜你喜欢
    • 2012-09-07
    • 2011-10-12
    • 2014-05-08
    • 1970-01-01
    • 1970-01-01
    • 2017-11-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多