删除操作
删除一条记录
删除对象需要指定主键或用Where指定额外条件
1
2
3
4
5
6
7
// 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";根据主键删除
可以根据主键和内联条件删除对象,作为函数参数传入
1
2
3
4
5
6
7
8
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);可以定义一个主键切片传给delete,以便高效删除数据
1
2
3
var users = []User{{ID: 1}, {ID: 2}, {ID: 3}}
db.Delete(&users)
// DELETE FROM users WHERE id IN (1,2,3);批量删除
如果指定的值不包含主键,那么会删除所有匹配的记录
1
2
3
4
5
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%";阻止全局删除
当试图执行不带任何条件的批量删除时,GORM会返回错误,如果一定要做,必须添加一些条件或者使用原生SQL
1
2
3
4
5
6
7
8
9
db.Delete(&User{}).Error // gorm.ErrMissingWhereClause
db.Delete(&[]User{{Name: "jinzhu1"}, {Name: "jinzhu2"}}).Error // gorm.ErrMissingWhereClause
db.Where("1 = 1").Delete(&User{})
// DELETE FROM `users` WHERE 1=1
db.Exec("DELETE FROM users")
// DELETE FROM users软删除
若model包含gorm.DeleteAt字段,则该model会获得软删除的能力,当调用delete时,GORM不会从数据库中删除该记录,而是会将DeleteAt字段设置为当前时间,而后的一般方法无法查找到这条记录
1
2
3
4
5
6
7
8
9
10
11
// user's ID is `111`
db.Delete(&user)
// UPDATE users SET deleted_at="2013-10-29 10:23" WHERE id = 111;
// Batch Delete
db.Where("age = ?", 20).Delete(&User{})
// UPDATE users SET deleted_at="2013-10-29 10:23" WHERE age = 20;
// Soft deleted records will be ignored when querying
db.Where("age = 20").Find(&user)
// SELECT * FROM users WHERE age = 20 AND deleted_at IS NULL;使用db.Unscoped().Find()查找被软删除的记录
使用db.Unscoped().Delete()永久删除记录
删除标志
Unix时间戳:导入
gorm.io/plugin/soft_delete插件可以定义为unix时间戳毫秒和纳秒:添加结构体tag
gorm:"softDelete:milli/nano"1/0:添加结构体tag
gorm:"softDelete:flag"以上可以混合使用