官方文档
删除

一、真删除

1、删除一条记录

删除一条记录的时候,删除对象需要指定主键

  1. // Email 的 ID 是 `10`
  2. db.Delete(&email)
  3. // DELETE from emails where id = 10;
  4. // 带额外条件的删除
  5. db.Where("name = ?", "jinzhu").Delete(&email)
  6. // DELETE from emails where id = 10 AND name = "jinzhu";

2、根据主键删除

  1. db.Delete(&User{}, 10)
  2. // DELETE FROM users WHERE id = 10;
  3. db.Delete(&User{}, "10")
  4. // DELETE FROM users WHERE id = 10;
  5. db.Delete(&users, []int{1,2,3})
  6. // DELETE FROM users WHERE id IN (1,2,3);

3、批量删除

如果指定的值不包括主属性,那么 GORM 会执行批量删除,它将删除所有匹配的记录

  1. db.Where("email LIKE ?", "%jinzhu%").Delete(Email{})
  2. // DELETE from emails where email LIKE "%jinzhu%";
  3. db.Delete(Email{}, "email LIKE ?", "%jinzhu%")
  4. // DELETE from emails where email LIKE "%jinzhu%";

二、软删除

如果实体类中包含了一个gorm.DeletedAt字段(由于gorm.Model中包含了这个字段,所以只需要实体类中包含了Model即可),它将自动获得软删除的能力。
拥有软删除能力的模型调用 Delete 时,记录不会被从数据库中真正删除。但 GORM 会将DeletedAt置为当前时间, 并且你不能再通过正常的查询方法找到该记录。

  1. // user 的 ID 是 `111`
  2. db.Delete(&user)
  3. // UPDATE users SET deleted_at="2013-10-29 10:23" WHERE id = 111;
  4. // 批量删除
  5. db.Where("age = ?", 20).Delete(&User{})
  6. // UPDATE users SET deleted_at="2013-10-29 10:23" WHERE age = 20;
  7. // 在查询时会忽略被软删除的记录
  8. db.Where("age = 20").Find(&user)
  9. // SELECT * FROM users WHERE age = 20 AND deleted_at IS NULL;

软删除之后,数据库中的deleted_at字段会填上对应的删除时间
此外,之后的一系列CURD都不会再检索到该数据
image.png

1、代码实现

  1. func DeleteUser(user dao.User) (int, string, dao.User) {
  2. result := dao.GormDB.Table("user").Where("id = ?", user.ID).First(&user)
  3. if result.Error != nil {
  4. return 4000, result.Error.Error(), dao.User{}
  5. }
  6. result = dao.GormDB.Table("user").Delete(&user) //软删除
  7. if result.Error != nil {
  8. return 4000, result.Error.Error(), dao.User{}
  9. }
  10. return 5000, "success", user
  11. }

2、查找被删除的记录

可以使用Unscoped来找到被软删除的记录

  1. db.Unscoped().Where("age = 20").Find(&users)
  2. // SELECT * FROM users WHERE age = 20;

3、永久删除

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

  1. db.Unscoped().Delete(&order)
  2. // DELETE FROM orders WHERE id=10;