全部学科
NodeJS全栈
nodejs
Python全栈
python
小程序首页
📅 2026-05-21 6 分钟 ✍️ juanwangdev

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

📝 发现内容有误?点击此处直接编辑

← 上一篇 GORM DeletedAt 字段使用
下一篇 → GORM 硬删除执行
想查看更多题目和详细解析?
小程序提供完整的题库、模拟考试和详细解析
马上就来

长按或扫描二维码,立即体验

扫码体验小程序
马上就来
使用微信扫描二维码
立即体验完整题库