阅读(3564) (0)

GORM 删除

2022-03-04 09:53:31 更新

删除一条记录

删除一条记录时,删除对象需要指定主键,否则会触发批量Delete,例如:

// Email 的 ID 是 `10`
db.Delete(&email)
// DELETE from emails where id = 10;

// 带额外条件的删除
db.Where("name = ?", "张三").Delete(&email)
// DELETE from emails where id = 10 AND name = "张三";

根据主键删除

GORM允许通过主键(可以是复合主键)和内联条件来删除对象,它可以使用数字,如以下例子

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 ?", "%张三%").Delete(&Email{})
// DELETE from emails where email LIKE "%张三%";

db.Delete(&Email{}, "email LIKE ?", "%张三%")
// DELETE from emails where email LIKE "%张三%";

软删除

如果你的模型包含了一个gorm.deletedat字段(gorm.Model 已经包含了该字段),它将自动获得软删除的能力!拥有软删除能力的模型调用Delete时,记录不会被数据库删除。但GORM会将DeletedAt置为当前时间, 并且你不能再通过普通的查询方法找到该记录。

// user 的 ID 是 `111`
db.Delete(&user)
// UPDATE users SET deleted_at="2022-03-04 10:16" WHERE id = 111;

// 批量删除
db.Where("age = ?", 20).Delete(&User{})
// UPDATE users SET deleted_at="2022-03-04 10:16" 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
}