5月29日 01:20
GORM 中的软删除(Soft Delete)是如何工作的?
GORM 软删除通过 gorm.DeletedAt 字段实现:模型包含该字段后,db.Delete() 不会执行 DELETE,而是 UPDATE SET deleted_at=NOW();查询时 GORM 自动追加 WHERE deleted_at IS NULL 过滤已删除记录。要用 Unscoped() 查询包含已删除的记录,用 Unscoped().Delete() 执行真正的硬删除。软删除的最大坑是唯一约束——已软删除的记录仍占据唯一索引位置,导致无法插入同值新记录,需用复合唯一索引 (email, deleted_at) 解决。
追问
db.Unscoped().Where("deleted_at IS NOT NULL").Find(&users)和db.Unscoped().Find(&users)结果有何区别?- 软删除记录如何恢复?恢复时唯一约束冲突怎么处理?
- 关联查询(Preload)中软删除的记录会被过滤吗?如何加载已删除的关联?
- 为什么不推荐在生产环境依赖软删除做数据审计?应该用什么替代方案?
- 自定义软删除字段(如
is_deleted bool)时 GORM 还会自动过滤吗?
写段代码
gotype User struct { gorm.Model Email string `gorm:"uniqueIndex:idx_email_deleted"` } // 复合唯一索引解决软删除冲突 // db.Unscoped().Delete(&user) // 硬删除 // db.Unscoped().Where("id = ?", id).Update("deleted_at", nil) // 恢复