使用 Gorm 操作数据库时,可以通过 soft delete 功能实现逻辑删除。这个功能就是在数据库中添加一个名为 deleted_at 的字段,在删除数据时只是将该字段标记为当前时间戳,而不是真正的物理删除。具体操作如下:
- 定义 Model
在定义 Model 时,需要在表结构中加入 DeletedAt 字段。
type User struct {
gorm.Model
Name string
Age int
Email string `gorm:"uniqueIndex"`
DeletedAt *time.Time // 添加 DeletedAt 字段
}
- 启用软删除
db := gorm.Open("mysql", "dsn")
db = db.Debug().Set("gorm:delete_option", "OPTION (OPTIMIZE FOR UNKNOWN)").Model(&User{}).Where("deleted_at is null") // 启用软删除
- 执行软删除
使用 Delete 方法进行软删除:
// 软删除一条记录
user := User{ID: 1}
db.Delete(&user)
// 查询所有未被软删除的记录(DeletedAt IS NULL)
var users []User
db.Find(&users)
查询结果将不包含已经被软删除的记录。
注意:如果你要查询已经被软删除的记录,可以使用 Unscoped 方法进行恢复。例如:
// 查询所有已被软删除的记录(DeletedAt IS NOT NULL)
var deletedUsers []User
db.Unscoped().Find(&deletedUsers)