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;);就像一個回收站,我覺得可以使用軟刪除。