gorm中实现软删除和硬删除
如果您的模型包含一个gorm.DeletedAt
字段(包含在 中gorm.Model
),它将自动获得软删除能力!
调用 时Delete
,记录不会从数据库中删除,但 GORM 会将DeletedAt
的值设置为当前时间,并且不再使用正常的 Query 方法查找数据。
软删除
// 用户 ID 为 `111`
db.Delete(&user)
// 更新用户 SET deleted_at="2013-10-29 10:23" WHERE id = 111;
// 批量删除
db.Where( "age = ?" , 20 ).Delete(&User{})
// UPDATE users SET deleted_at="2013-10-29 10:23" WHERE age = 20;
// 查询时软删除的记录会被忽略
db.Where( "age = 20" ).Find(&user)
// SELECT * FROM users WHERE age = 20 AND deleted_at IS NULL;
查找软删除记录
db.Unscoped().Where( "age = 20" ).Find(&users)
// SELECT * FROM users WHERE age = 20;
硬删除:永久删除
db.Unscoped().Delete(&order)
// DELETE FROM orders WHERE id=10;
注意:
如果程序中,使用了默认的gorm生成数据库,使用了软删除,那么在执行gorm的查询结果中,被软删除的数据是不能被查询到的;
但是,在数据库工具中,使用软删除的数据,执行t-sql语句可以被查询到,判断的标志是,deleted_at有时间(deleted_at IS NULL;);就像一个回收站,我觉得可以使用软删除。