当前位置:首页 > Go > 正文

GORM软删除详解(Go语言中使用GORM实现软删除的完整教程)

在开发Web应用或后端服务时,我们经常需要“删除”数据,但又不希望真正从数据库中物理移除记录。这时候就需要用到软删除(Soft Delete)功能。本文将围绕 GORM软删除 这一主题,手把手教你如何在 Go语言 中使用 GORM ORM框架 实现软删除,即使是编程新手也能轻松上手!

GORM软删除详解(Go语言中使用GORM实现软删除的完整教程) GORM软删除 GORM Go语言 Go语言ORM框架 软删除实现教程 第1张

什么是软删除?

软删除并不是真正地从数据库中删除记录,而是通过一个字段(通常是 deleted_at)来标记该记录已被“删除”。查询时,GORM会自动忽略这些被标记的记录,从而达到逻辑删除的效果。

相比硬删除(物理删除),软删除有以下优势:

  • 防止误删重要数据
  • 便于数据恢复
  • 满足审计和日志追踪需求

GORM如何支持软删除?

GORM 内置了对软删除的支持。你只需要在结构体中嵌入 gorm.DeletedAt 字段(或使用 gorm.Model,它已包含该字段),GORM 就会自动启用软删除功能。

示例:定义支持软删除的模型

package mainimport (  "gorm.io/gorm"  "gorm.io/driver/sqlite" // 或 mysql、postgres 等)// User 模型type User struct {  ID   uint   `gorm:"primaryKey"`  Name string  Email string  gorm.DeletedAt // 关键:启用软删除}// 或者直接使用 gorm.Model(它内部已包含 DeletedAt)// type User struct {//   gorm.Model//   Name  string//   Email string// }

执行软删除操作

当你调用 db.Delete() 方法时,GORM 不会真正删除记录,而是将当前时间写入 deleted_at 字段。

// 初始化数据库(以 SQLite 为例)db, err := gorm.Open(sqlite.Open("test.db"), &gorm.Config{})if err != nil {  panic("failed to connect database")}// 自动迁移db.AutoMigrate(&User{})// 创建用户user := User{Name: "张三", Email: "zhangsan@example.com"}db.Create(&user)// 软删除用户db.Delete(&user)// 此时数据库中的 deleted_at 字段会被设置为当前时间

查询时自动过滤已删除记录

默认情况下,GORM 查询不会返回已被软删除的记录:

var users []User// 只会查出未被删除的用户db.Find(&users)

如何查询被软删除的记录?

如果你确实需要查看或恢复被删除的数据,可以使用 Unscoped() 方法:

// 查询所有记录,包括已软删除的var allUsers []Userdb.Unscoped().Find(&allUsers)// 恢复某条记录(清空 deleted_at)db.Unscoped().Model(&User{}).Where("id = ?", 1).Update("deleted_at", nil)

自定义软删除字段(可选)

虽然 GORM 默认使用 deleted_at,但你也可以自定义软删除字段。不过这需要实现 gorm.DeletedAtField 接口,对初学者来说建议使用默认方式。

总结

通过本文,你已经掌握了在 Go语言 中使用 GORM ORM框架 实现 软删除 的完整流程。只需在模型中加入 gorm.DeletedAt,GORM 就会自动处理软删除逻辑,极大简化了开发工作。

记住关键词:GORM软删除GORM Go语言Go语言ORM框架软删除实现教程,它们将帮助你在项目中快速定位相关技术方案。

赶快在你的项目中试试吧!如有疑问,欢迎留言交流。