go語言gorm的delete


阻止全局刪除


如果在沒有任何條件的情況下執行批量刪除,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;

您可以使用 Unscoped 找到被軟刪除的記錄查找被軟刪除的記錄

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM