阻止全局刪除
如果在沒有任何條件的情況下執行批量刪除,GORM 不會執行該操作,並返回 ErrMissingWhereClause
錯誤
對此,你必須加一些條件,或者使用原生 SQL,或者啟用 AllowGlobalUpdate
模式,例如:
db.Delete(&User{}).Error // gorm.ErrMissingWhereClause db.Where("1 = 1").Delete(&User{}) // DELETE FROM `users` WHERE 1=1 db.Exec("DELETE FROM users") // DELETE FROM users db.Session(&gorm.Session{AllowGlobalUpdate: true}).Delete(&User{}) // DELETE FROM users
軟刪除
如果您的模型包含了一個 gorm.DeletedAt
字段(gorm.Model
已經包含了該字段),它將自動獲得軟刪除的能力!
擁有軟刪除能力的模型調用 Delete
時,記錄不會被從數據庫中真正刪除。但 GORM 會將 DeletedAt
置為當前時間, 並且你不能再通過正常的查詢方法找到該記錄。
// user 的 ID 是 `111` db.Delete(&user) // UPDATE users 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;
如果您不想引入 gorm.Model
,您也可以這樣啟用軟刪除特性:
type User struct {
ID int
Deleted gorm.DeletedAt
Name string
}
永久刪除
db.Unscoped().Where("age = 20").Find(&users) // SELECT * FROM users WHERE age = 20;