刪除
刪除一條記錄
刪除一條記錄時,刪除對象需要指定主鍵,否則會觸發 批量 Delete,例如:
db.Debug().Where("id = ?", 6).Delete(new(User))
// DELETE FROM `users` WHERE id = 6
db.Debug().Delete(User{}, 5)
// DELETE FROM `users` WHERE `users`.`id` = 5
根據主鍵刪除
GORM 允許通過主鍵(可以是復合主鍵)和內聯條件來刪除對象,它可以使用數字(如以下例子。也可以使用字符串——譯者注)。查看 查詢-內聯條件(Query Inline Conditions) 了解詳情。
// 根據主鍵刪除一個或多個
db.Debug().Delete(&User{}, []int{11, 12})
// DELETE FROM `users` WHERE `users`.`id` IN (11, 12)
Delete Hook
對於刪除操作,GORM 支持 BeforeDelete、AfterDelete Hook,在刪除記錄時會調用這些方法
func (u *User) BeforeDelete(tx *gorm.DB) (err error) {
fmt.Println("User BeforeDelete執行了")
return
}
func (u *User) AfterDelete(tx *gorm.DB) (err error) {
fmt.Println("User AfterDelete執行了")
return
}
批量刪除
如果指定的值不包括主屬性,那么 GORM 會執行批量刪除,它將刪除所有匹配的記錄
db.Debug().Where("name = ?", "dawang").Delete(&User{})
// DELETE FROM `users` WHERE name = 'dawang'
db.Debug().Delete(new(User), "name LIKE ?", "%wang%")
// DELETE FROM `users` WHERE name LIKE '%wang%'
阻止全局刪除
如果在沒有任何條件的情況下執行批量刪除,GORM 不會執行該操作,並返回 WHERE conditions required 錯誤,對此,你必須加一些條件,或者使用原生 SQL,或者啟用 AllowGlobalUpdate 模式,例如:
db.Delete(&User{}).Error // WHERE conditions required
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的值設置為當前時間,並且使用常規查詢方法無法再查找數據
db.Debug().Delete(new(User), 21)
// UPDATE `users` SET `deleted_at`='2021-11-22 15:25:02.646' WHERE `users`.`id` = 23 AND `users`.`deleted_at` IS NULL
var user User
db.First(&user, 21)
fmt.Println(user)
// SELECT * FROM `users` WHERE `users`.`id` = 23 AND `users`.`deleted_at` IS NULL ORDER BY `users`.`id` LIMIT 1
查找軟刪除記錄
您可以找到具有非范圍的軟刪除記錄
db.Debug().Unscoped().First(&user, 21)
// SELECT * FROM `users` WHERE `users`.`id` = 21 ORDER BY `users`.`id` LIMIT 1
永久刪除
您可以使用Unscoped永久刪除匹配的記錄
db.Debug().Unscoped().Delete(&User{}, 20)
// DELETE FROM `users` WHERE `users`.`id` = 20