删除
删除记录
删除记录时,需要指定主键,否则会触发 批量删除 (Batch Delete)。
// Email 的 ID 是 `10`
db.Delete(&email)
// DELETE from emails where id = 10;
// 带额外条件的删除
db.Where("name = ?", "jinzhu").Delete(&email)
// DELETE from emails where id = 10 AND name = "jinzhu";
根据主键删除
db.Delete(&User{}, 10)
// DELETE FROM users WHERE id = 10;
db.Delete(&User{}, "10")
// DELETE FROM users WHERE id = 10;
db.Delete(&users, []int{1,2,3})
// DELETE FROM users WHERE id IN (1,2,3);
批量删除
如果指定的值没有主键,GORM 会执行批量删除。
db.Where("email LIKE ?", "%jinzhu%").Delete(&Email{})
// DELETE from emails where email LIKE "%jinzhu%";
db.Delete(&Email{}, "email LIKE ?", "%jinzhu%")
// DELETE from emails where email LIKE "%jinzhu%";
软删除 (Soft Delete)
如果你的模型包含 gorm.DeletedAt 字段(也包含在 gorm.Model 中),它将自动获得软删除的能力!
当调用 Delete 时,记录不会从数据库中永久删除。相反,GORM 会将 DeletedAt 的值设置为当前时间,并且以后普通的查询方法将找不到该记录。
// 批量删除
db.Where("age = ?", 20).Delete(&User{})
// UPDATE users SET deleted_at="2020-10-23 11:14:00" WHERE age = 20;
// 查询时会忽略被软删除的记录
db.Where("age = 20").Find(&user)
// SELECT * FROM users WHERE age = 20 AND deleted_at IS NULL;
查找被软删除的记录
可以使用 Unscoped 查找被软删除的记录。
db.Unscoped().Where("age = 20").Find(&users)
// SELECT * FROM users WHERE age = 20;
永久删除
可以使用 Unscoped 永久删除匹配的记录。
db.Unscoped().Delete(&order)
// DELETE FROM orders WHERE id = 10;