gorm ORM框架Delete方法使用注意事项 删除回写,软删除,自定义条件删除,删除钩子函数等使用

gorm框架中的Delete方法用于删除数据,他的作用是 删除与给定条件匹配的value。如果value包含主键,则将其包含在删除条件中。如果value包含deleted_at字段,则Delete会执行软删除,如果deleted_at的值为空,则gorm通过将置为当前时间来实现

Delete方法定义


// Delete deletes value matching given conditions. If value contains primary key it is included in the conditions. If
// value includes a deleted_at field, then Delete performs a soft delete instead by setting deleted_at with the current
// time if null.
func (db *DB) Delete(value interface{}, conds ...interface{}) (tx *DB) {
	tx = db.getInstance()
	if len(conds) > 0 {
		if exprs := tx.Statement.BuildCondition(conds[0], conds[1:]...); len(exprs) > 0 {
			tx.Statement.AddClause(clause.Where{Exprs: exprs})
		}
	}
	tx.Statement.Dest = value
	return tx.callbacks.Delete().Execute(tx)
}

注意事项

1.  Delete方法中第一个参数value他是一个要删除的对象,这个对象需要使用指针类型,gorm会将删除的数据赋值到这个对象上;

2. 如果这个对象包含主键,他会自动将主键当做删除条件;

3. 如果这个对象包含deleted_at字段,则gorm会自动执行软删除(即不会真正删除数据,仅会将deleted_at字段设置为当前时间);

4. 如果我们在Delete方法前面已经使用Where设置了删除条件,则Delete方法中的参数可以设置为nil , 即可以是  xxx.Delete(nil) ;  如:

   tx := db.Table("users").Where(" id IN (?) ", ids).Delete(nil)
	if tx.Error != nil {
		return nil, tx.Error
	}
	num := tx.RowsAffected // 获取删除的数据条数

5. Delete方法的第二个参数conds 删除条件,他是一个可选参数。

6. Delete方法支持钩子函数,所谓的钩子函数,其实就是将方法 BeforeDelete(tx *gorm.DB) (err error) 绑定到你要删除的对象上即可。

如: 在user对象上面应用删除钩子函数

func (u *User) BeforeDelete(tx *gorm.DB) (err error) {
    if u.Role == "admin" {
        return errors.New("admin user not allowed to delete")
    }
    return
}

7. 可使用 Unscoped方法来直接删除指定的数据。

  如: db.Unscoped().Delete(&user)

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

// 根据主键删除
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 方法,以便更高效的删除数据量大的记录
var users = []User{{ID: 1}, {ID: 2}, {ID: 3}}
db.Delete(&users)
// DELETE FROM users WHERE id IN (1,2,3);

db.Delete(&users, "name LIKE ?", "%jinzhu%")
// DELETE FROM users WHERE name LIKE "%jinzhu%" AND id IN (1,2,3); 

// 返回被删除的数据,仅当数据库支持回写功能时才能正常运行,如下例:
var users []User
DB.Clauses(clause.Returning{}).Where("role = ?", "admin").Delete(&users)
// DELETE FROM `users` WHERE role = "admin" RETURNING *
// users => []User{{ID: 1, Name: "jinzhu", Role: "admin", Salary: 100}, {ID: 2, Name: "jinzhu.2", Role: "admin", Salary: 1000}}

// 回写指定的列
DB.Clauses(clause.Returning{Columns: []clause.Column{{Name: "name"}, {Name: "salary"}}}).Where("role = ?", "admin").Delete(&users)
// DELETE FROM `users` WHERE role = "admin" RETURNING `name`, `salary`
// users => []User{{ID: 0, Name: "jinzhu", Role: "", Salary: 100}, {ID: 0, Name: "jinzhu.2", Role: "", Salary: 1000}}


  • 7
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值