gorm软删除_删除 · GORM V2 中文文档 · 看云

本文详细介绍了GORM在Go语言中如何进行数据库记录的删除操作,包括单条删除、批量删除、条件删除以及软删除。GORM支持`BeforeDelete`和`AfterDelete`钩子,允许在删除前后的自定义处理。此外,当模型包含`DeletedAt`字段时,可以实现软删除功能,记录不会从数据库中物理移除,而是设置`DeletedAt`时间为当前时间。同时,展示了如何查找和永久删除被软删除的记录。
摘要由CSDN通过智能技术生成

# 删除

## 删除记录

删除一条记录

```go

// 删除一条已有的记录(email 的主键值为 10)

db.Delete(&email)

// DELETE from emails where id=10;

// 通过内联条件删除记录

db.Delete(&Email{}, 20)

// DELETE from emails where id=20;

// 带上其它条件

db.Where("name = ?", "jinzhu").Delete(&email)

// DELETE FROM emails WHERE id=10 AND name = 'jinzhu'

```

## 删除钩子

对于删除操作,GORM 支持 `BeforeDelete`、`AfterDelete` 钩子,在删除记录时会调用这些方法,详情请参考 [钩子](../教程/hooks.html)

```go

func (u *User) BeforeDelete(tx *gorm.DB) (err error) {

if u.Role == "admin" {

return errors.New("admin user not allowed to delete")

}

return

}

```

## 批量删除

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

```go

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 不会执行该操作,并返回`ErrMissingWhereClause`错误

您可以使用 `1 = 1` 之类的条件来强制全局删除

```go

db.Delete(&User{}).Error // gorm.ErrMissingWhereClause

db.Where("1 = 1").Delete(&User{})

// DELETE `users` WHERE 1=1

```

## 软删除

如果您的模型包含了一个 `gorm.deletedat` 字段(`gorm.Model` 已经包含了该字段),它将自动获得软删除的能力!

拥有软删除能力的模型调用 `Delete` 时,记录不会被数据库。但 GORM 会将 `DeletedAt` 置为当前时间, 并且你不能再通过普通的查询方法找到该记录。

```go

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;

```

如果您不想引入 `gorm.Model`,您也可以这样启用软删除特性:

```

type User struct {

ID int

Deleted gorm.DeletedAt

Name string

}

```

### 查找被软删除的记录

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

```go

db.Unscoped().Where("age = 20").Find(&users)

// SELECT * FROM users WHERE age = 20;

```

### 永久删除

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

```go

db.Unscoped().Delete(&order)

// DELETE FROM orders WHERE id=10;

```

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值