首页/ 学科题库/ gorm/ GORM 恢复已删除记录
gorm 实战教程

GORM 恢复已删除记录

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

想在手机上练这篇的配套题目?
使用微信 卷王开发者小程序/App,首页顶部扫一扫识别下方二维码,即可解锁本讲对应真题与错题本。
了解产品 App
← 上一篇 GORM 软删除查询过滤 下一篇 → GORM 硬删除执行