GORM 恢复已删除记录
GORM 软删除记录可通过 Unscoped 查询并重置 DeletedAt 为 NULL 恢复,本文介绍完整恢复流程。
恢复原理
软删除记录仍存在于数据库,只是 DeletedAt 有值。将其重置为 NULL 即可恢复:
Go
type User struct {
ID uint
Name string
DeletedAt gorm.DeletedAt `gorm:"index"`
}
查询已删除记录
使用 Unscoped() 查询被软删除的记录:
Go
var user User
// 查询已删除的用户记录
db.Unscoped().Where("id = ? AND deleted_at IS NOT NULL", 1).First(&user)
恢复记录
将 DeletedAt 更新为 NULL:
Go
// 方法1: 直接更新字段为 nil
db.Unscoped().Model(&user).Update("deleted_at", nil)
// 方法2: 使用 map 更新
db.Unscoped().Model(&User{}).Where("id = ?", 1).Update("deleted_at", nil)
// 方法3: 批量恢复
db.Unscoped().Model(&User{}).Where("deleted_at IS NOT NULL").Update("deleted_at", nil)
完整恢复示例
Go
func RestoreUser(db *gorm.DB, userID uint) error {
var user User
// 1. 查询已删除记录
if err := db.Unscoped().Where("id = ?", userID).First(&user).Error; err != nil {
return err
}
// 2. 检查是否已被软删除
if user.DeletedAt.Valid {
// 3. 恢复记录
return db.Unscoped().Model(&user).Update("deleted_at", nil).Error
}
return fmt.Errorf("用户未被删除")
}
恢复操作必须使用
Unscoped(),否则无法查询到已删除记录。
要点总结
- 软删除记录仍存在数据库,
DeletedAt有值 - 使用
Unscoped()查询已删除记录 - 通过
Update("deleted_at", nil)重置为 NULL 恢复 - 恢复前需确认记录确实已被软删除
文章存放路径:D:\git2\jwdev\articles\GORM\进阶\软删除机制\恢复已删除记录.md
📝 发现内容有误?点击此处直接编辑