软删除级联不起作用
Soft delete cascade not working
Objective: 如果一个用户在软删除中被标记为已删除,他的日历也应该被标记为已删除。
结构:
type User struct {
gorm.Model
Username string
FirstName string
LastName string
Calendar Calendar
}
type Calendar struct {
gorm.Model
Name string
UserID uint
}
约束条件:
db.Model(&Calendar{}).AddForeignKey("user_id", "users(id)", "CASCADE","CASCADE")
问题:
硬删除有效:用户和他的日历都被删除(记录消失)
db.Exec("Delete from users where id=3")
软删除未按预期工作:
db.Where("id = ?", 3).Delete(&User{})
通过软删除,
- 用户 table 字段 => deleted_at 已过时。
- 日历table =? deleted_at 为空白
有什么想法吗?
软删除意味着 gorm 不会删除您的数据。它只标记一个非零的 DeleteAt
时间戳。数据库不直接支持。所以外键在这里没有作用。
这意味着您需要自己手动实现级联删除,如下所示:
func DeleteUser(db *gorm.DB, id int) error {
tx := db.Begin()
if tx.Where("id = ?", id).Delete(&User{}); tx.Error != nil {
tx.Rollback()
return tx.Error
}
// Changed this line
// if tx.Where("user_id = id", 3).Delete(&Calendar{}); tx.Error != nil {
if tx.Where("user_id = ?", id).Delete(&Calendar{}); tx.Error != nil {
tx.Rollback()
return tx.Error
}
return tx.Commit().Error
}
Objective: 如果一个用户在软删除中被标记为已删除,他的日历也应该被标记为已删除。
结构:
type User struct {
gorm.Model
Username string
FirstName string
LastName string
Calendar Calendar
}
type Calendar struct {
gorm.Model
Name string
UserID uint
}
约束条件:
db.Model(&Calendar{}).AddForeignKey("user_id", "users(id)", "CASCADE","CASCADE")
问题:
硬删除有效:用户和他的日历都被删除(记录消失)
db.Exec("Delete from users where id=3")
软删除未按预期工作:
db.Where("id = ?", 3).Delete(&User{})
通过软删除,
- 用户 table 字段 => deleted_at 已过时。
- 日历table =? deleted_at 为空白
有什么想法吗?
软删除意味着 gorm 不会删除您的数据。它只标记一个非零的 DeleteAt
时间戳。数据库不直接支持。所以外键在这里没有作用。
这意味着您需要自己手动实现级联删除,如下所示:
func DeleteUser(db *gorm.DB, id int) error {
tx := db.Begin()
if tx.Where("id = ?", id).Delete(&User{}); tx.Error != nil {
tx.Rollback()
return tx.Error
}
// Changed this line
// if tx.Where("user_id = id", 3).Delete(&Calendar{}); tx.Error != nil {
if tx.Where("user_id = ?", id).Delete(&Calendar{}); tx.Error != nil {
tx.Rollback()
return tx.Error
}
return tx.Commit().Error
}