您的位置:首页 > 游戏 > 手游 > gorm ORM框架Delete方法使用注意事项 删除回写,软删除,自定义条件删除,删除钩子函数等使用

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

2025/2/13 9:58:11 来源:https://blog.csdn.net/tekin_cn/article/details/140594934  浏览:    关键词: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 = valuereturn 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}}

版权声明:

本网仅为发布的内容提供存储空间,不对发表、转载的内容提供任何形式的保证。凡本网注明“来源:XXX网络”的作品,均转载自其它媒体,著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处。

我们尊重并感谢每一位作者,均已注明文章来源和作者。如因作品内容、版权或其它问题,请及时与我们联系,联系邮箱:809451989@qq.com,投稿邮箱:809451989@qq.com