删除

删除记录时,删除的值需要有主键,否则会触发批量删除 ,例如:

// Email's ID is `10`
db.Delete(&email)
// DELETE from emails where id = 10;

// Delete with additional conditions
db.Where("name = ?", "jinzhu").Delete(&email)
// DELETE from emails where id = 10 AND name = "jinzhu";

1 阻止全局删除

如果在没有任何条件的情况下执行批量删除,GORM 将不会运行它,并将返回 ErrMissingWhereClause 错误

必须使用一些条件或使用原始 SQL 或启用 AllowGlobalUpdate 模式,例如:

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

db.Session(&gorm.Session{AllowGlobalUpdate: true}).Delete(&User{})
// DELETE FROM users

2 使用主键删除

GORM 允许使用内联条件的主键删除对象,它适用于数字

3 批量删除

指定的值没有主值,GORM 将执行批量删除,它将删除所有匹配的记录

4 返回已删除的数据

返回已删除的数据,仅适用于数据库支持返回,例如:

5 软删除

如果模型包含 gorm.DeletedAt 字段(包含在 gorm.Model 中),它将自动获得软删除功能

当调用 Delete 时,记录不会从数据库中删除,但 GORM 会将 DeletedAt 的值设置为当前时间,并且无法再使用常规查询方法找到数据。

5.1 查找软删除记录

可以使用 Unscoped 查找软删除的记录

5.2 永久删除

可以使用 Unscoped 永久删除匹配的记录

5.3 其他的删除标志

6 函数说明

6.1 func (db *DB) Delete(value interface{}, conds ...interface{}) (tx *DB)

执行删除操作,行为取决于模型是否启用了软删除:

  • 软删除模型 → 设置 DeletedAt时间戳

  • 普通模型 → 物理删除记录

最后更新于