gorm中的刪除


刪除

刪除一條記錄

刪除一條記錄時,刪除對象需要指定主鍵,否則會觸發 批量 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


免責聲明!

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



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