返回

数据库数据处理妙招:GORM 软删除原理与实践

后端

导语

在数据库中,当我们不再需要某些业务数据时,通常会将其删除。但删除本身是个语义比较宽泛的概念,因为本质上很多时候我们需要的是让这些数据无法再影响到当前的业务系统,无法被用户看到,而做到这一点并不需要完完全全删掉。

在软件工程中,我们把这种操作称为软删除。软删除和真正的删除的区别在于,软删除并不会真正地从数据库中删除数据,它只是将数据的某个字段的值设置为一个特定的值,比如 deleted_at,来标记该数据已被删除。这样,当我们查询数据库时,这些被软删除的数据就不会出现在结果集中。

软删除有许多优点。首先,它可以帮助我们防止误删数据。其次,软删除可以帮助我们保留历史数据,以便在需要时进行查询。第三,软删除可以帮助我们实现数据的逻辑删除,而不需要完全删除数据,从而避免数据丢失。

GORM 中的软删除

GORM 是一个流行的 Go 语言 ORM 框架。它提供了对软删除的支持,使我们可以轻松地实现软删除功能。

要在 GORM 中使用软删除,我们需要先在模型中定义一个 deleted_at 字段,并将其类型设置为 time.Time。然后,我们需要在模型中实现 DeletedAt() 方法,该方法返回 deleted_at 字段的值。

type User struct {
	ID        uint `gorm:"primary_key"`
	Name      string
	DeletedAt time.Time `gorm:"index"`
}

func (u *User) DeletedAt() (deletedAt time.Time) {
	return u.DeletedAt
}

一旦我们定义了 deleted_at 字段和 DeletedAt() 方法,GORM 就会自动为我们实现软删除功能。当我们调用 Delete() 方法时,GORM 不会真正地删除数据,它只是将 deleted_at 字段的值设置为当前时间。

db.Delete(&user)

当我们查询数据库时,GORM 会自动忽略所有 deleted_at 字段不为 null 的数据。这意味着,这些数据不会出现在查询结果集中。

var users []User
db.Find(&users)

如果我们想查询所有数据,包括被软删除的数据,我们可以使用 WithDeleted() 方法。

var users []User
db.WithDeleted().Find(&users)

软删除的优点和局限性

软删除有很多优点,包括:

  • 防止误删数据
  • 保留历史数据
  • 实现数据的逻辑删除

然而,软删除也有一些局限性,包括:

  • 增加了数据库空间的使用
  • 降低了查询性能
  • 可能导致数据不一致

使用软删除的最佳实践

以下是使用软删除的一些最佳实践:

  • 在模型中定义一个 deleted_at 字段,并将其类型设置为 time.Time
  • 在模型中实现 DeletedAt() 方法,该方法返回 deleted_at 字段的值。
  • 使用 Delete() 方法来软删除数据。
  • 使用 WithDeleted() 方法来查询所有数据,包括被软删除的数据。
  • 定期清理被软删除的数据,以释放数据库空间。

结语

软删除是一种非常有用的功能,可以帮助我们防止误删数据,保留历史数据,并实现数据的逻辑删除。GORM 为我们提供了对软删除的支持,使我们可以轻松地实现软删除功能。在使用软删除时,我们需要权衡它的优点和局限性,并遵循一些最佳实践,以确保数据的安全和一致性。