全部学科
Python全栈
python
NodeJS全栈
nodejs
📅 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 软删除查询过滤
下一篇 → GORM 硬删除执行
扫码体验小程序
加载中
想在手机上刷题学习?
使用微信卷王开发者小程序,打开首页顶部扫码功能识别二维码