GORM 硬删除执行
GORM 默认软删除,使用 Unscoped().Delete() 可执行真正的物理删除,本文介绍硬删除执行方法。
硬删除定义
硬删除直接从数据库移除记录,不可恢复。GORM 需显式使用 Unscoped() 才能执行物理删除:
Go
type User struct {
ID uint
Name string
DeletedAt gorm.DeletedAt `gorm:"index"`
}
单条硬删除
Go
// 物理删除 id=1 的记录
db.Unscoped().Delete(&User{}, 1)
// 生成 SQL: DELETE FROM users WHERE id = 1
批量硬删除
Go
// 按条件批量物理删除
db.Unscoped().Where("status = ?", "expired").Delete(&User{})
// 生成 SQL: DELETE FROM users WHERE status = 'expired'
// 删除所有已软删除的记录
db.Unscoped().Where("deleted_at IS NOT NULL").Delete(&User{})
与软删除对比
| 方法 | 行为 | SQL |
|---|---|---|
db.Delete() | 软删除 | UPDATE users SET deleted_at = NOW() |
db.Unscoped().Delete() | 硬删除 | DELETE FROM users |
使用场景
Go
// 场景1: 清理测试数据
db.Unscoped().Where("name LIKE ?", "test_%").Delete(&User{})
// 场景2: 物理删除已软删除记录
db.Unscoped().Where("deleted_at < ?", time.Now().AddDate(0, 0, -30)).Delete(&User{})
// 场景3: 带关联删除
db.Unscoped().Select("Orders", "Profile").Delete(&user)
硬删除不可恢复,执行前务必确认数据安全或已备份。
要点总结
- 硬删除使用
Unscoped().Delete()执行物理删除 - 软删除是
UPDATE设置DeletedAt,硬删除是DELETE - 支持按条件批量硬删除
- 硬删除不可恢复,生产环境慎用
文章存放路径:D:\git2\jwdev\articles\GORM\进阶\软删除机制\硬删除执行.md
📝 发现内容有误?点击此处直接编辑