一、真删除
1、删除一条记录
删除一条记录的时候,删除对象需要指定主键
// 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";
2、根据主键删除
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);
3、批量删除
如果指定的值不包括主属性,那么 GORM 会执行批量删除,它将删除所有匹配的记录
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.DeletedAt
字段(由于gorm.Model
中包含了这个字段,所以只需要实体类中包含了Model即可),它将自动获得软删除的能力。
拥有软删除能力的模型调用 Delete
时,记录不会被从数据库中真正删除。但 GORM 会将DeletedAt
置为当前时间, 并且你不能再通过正常的查询方法找到该记录。
// user 的 ID 是 `111`
db.Delete(&user)
// UPDATE users SET deleted_at="2013-10-29 10:23" WHERE id = 111;
// 批量删除
db.Where("age = ?", 20).Delete(&User{})
// UPDATE users SET deleted_at="2013-10-29 10:23" WHERE age = 20;
// 在查询时会忽略被软删除的记录
db.Where("age = 20").Find(&user)
// SELECT * FROM users WHERE age = 20 AND deleted_at IS NULL;
软删除之后,数据库中的deleted_at字段会填上对应的删除时间
此外,之后的一系列CURD都不会再检索到该数据
1、代码实现
func DeleteUser(user dao.User) (int, string, dao.User) {
result := dao.GormDB.Table("user").Where("id = ?", user.ID).First(&user)
if result.Error != nil {
return 4000, result.Error.Error(), dao.User{}
}
result = dao.GormDB.Table("user").Delete(&user) //软删除
if result.Error != nil {
return 4000, result.Error.Error(), dao.User{}
}
return 5000, "success", user
}
2、查找被删除的记录
可以使用Unscoped
来找到被软删除的记录
db.Unscoped().Where("age = 20").Find(&users)
// SELECT * FROM users WHERE age = 20;
3、永久删除
您也可以使用 Unscoped
永久删除匹配的记录
db.Unscoped().Delete(&order)
// DELETE FROM orders WHERE id=10;