红魔咖啡馆

头发越掉越多,头发越掉越少

0%

【GORM】删除操作

删除操作

删除一条记录

删除对象需要指定主键或用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时间戳

  • 毫秒和纳秒:添加结构体taggorm:"softDelete:milli/nano"

  • 1/0:添加结构体taggorm:"softDelete:flag"

  • 以上可以混合使用