首页 > 其他分享 >使用 GORM 进行软删除和硬删除

使用 GORM 进行软删除和硬删除

时间:2023-07-11 11:12:27浏览次数:43  
标签:删除 记录 标记 id result 使用 GORM

目录结构:

  • 软删除
    • 在 GORM 中使用软删除
    • 删除已经被标记为已删除的记录
  • 硬删除
    • 在 GORM 中使用硬删除
    • 永久删除已经被标记为已删除的记录

软删除

在 GORM 中,软删除(soft delete)是指将记录标记为已删除,而不是从数据库中永久删除记录。软删除可以保留已删除记录的历史记录,同时避免意外删除记录。在 GORM 中,您可以使用 DeletedAt 字段来实现软删除。如果您在模型中定义了 DeletedAt 字段,GORM 会自动为您添加一个软删除过滤器,使查询不包括已被标记为已删除的记录。如果您想要查询已经被标记为已删除的记录,或者执行硬删除,您可以使用 Unscoped方法来移除软删除过滤器。

在 GORM 中使用软删除

在 GORM 中,使用软删除非常简单。只需要在模型中定义一个 DeletedAt 字段即可。下面是一个示例:

go
type User struct {
    gorm.Model
    Name      string
    Email     string
    DeletedAt gorm.DeletedAt // 软删除
}

在这个示例中,我们在 User 模型中定义了一个 DeletedAt 字段。这将自动为模型添加软删除过滤器,并将查询中不包括已被标记为已删除的记录。

删除已经被标记为已删除的记录

如果您想要删除已经被标记为已删除的记录,您可以使用以下代码:

go
func (r *UserRepository) DeleteSoftDeletedByID(id uint) error {
    result := r.db.Unscoped().Delete(&User{}, id)
    if result.Error != nil {
        return result.Error
    }
    if result.RowsAffected == 0 {
        return gorm.ErrRecordNotFound
    }
    return nil
}

在这个方法中,我们使用 Unscoped 方法来移除软删除过滤器,并使用 Delete 方法来删除记录。这将永久删除记录,而不是标记记录为已删除。

对应的 SQL 语句如下:

sql
UPDATE `users` SET `deleted_at`='2023-07-11 12:00:00' WHERE `users`.`deleted_at` IS NULL AND `id` IN (?, ?, ?)

这个 SQL 语句会永久删除 users 表中 id 为 1 的记录。

硬删除

在某些情况下,您可能需要完全删除记录,而不是标记记录为已删除。这种情况下,您可以使用硬删除(hard delete)。在 GORM 中,您可以使用 Unscoped 方法来永久删除已经被标记为已删除的记录。

在 GORM 中使用硬删除

在 GORM 中,使用硬删除也非常简单。只需要在查询中使用 Unscoped 方法就可以永久删除已经被标记为已删除的记录。下面是一个示例:

go
func (r *UserRepository) DeleteHardDeletedByID(id uint) error {
    result := r.db.Unscoped().Delete(&User{}, id)
    if result.Error != nil {
        return result.Error
    }
    if result.RowsAffected == 0 {
        return gorm.ErrRecordNotFound
    }
    return nil
}

在这个方法中,我们使用 Unscoped 方法来移除软删除过滤器,并使用 Delete 方法来永久删除记录。

对应的 SQL 语句如下:

sql
DELETE FROM `users` WHERE `users`.`id` = 1

这个 SQL 语句会删除 users 表中 id 为 1 的记录。

总结:

通过使用 GORM 中的软删除和硬删除特性,您可以有效地管理数据库中的记录。软删除可以让您标记记录为已删除,同时保留记录的历史记录,避免意外删除记录。而硬删除则可以完全删除记录,如果您需要彻底清除记录,硬删除是一个很好的选择。

需要注意的是,软删除并不是所有情况下都适用。如果您的应用程序需要满足 GDPR、HIPAA 或其他法律法规的要求,您可能需要永久删除某些记录。此外,在某些情况下,软删除可能会影响查询性能,因为查询需要过滤已经被标记为已删除的记录。

因此,在使用软删除和硬删除时,请根据您的应用程序的特定需求,进行相应的选择和配置。

标签:删除,记录,标记,id,result,使用,GORM
From: https://www.cnblogs.com/zhanchenjin/p/17543441.html

相关文章

  • 【辅助工具】IDEA使用
    IDEA使用快捷键快捷键alt+enter:代码错误智能提示alt+up:上个方法alt+down:下个方法alt+1:快速定位到项目窗口,还可边按键盘输文件名查找文件alt+F7:定位类,方法在哪儿有用到alt+7:文件结构图Ctrl类ctrl+tab:切换文件ctrlctrl:弹出一个框输入运行指令ctrl+e:展示最近修改......
  • Hadoop中hive的使用
    启动元数据管理服务(必须启动,否则无法工作)前台启动:bin/hive--servicemetastore后台启动:nohupbin/hive--servicemetastore>>logs/metastore.log2>&1& 启动客户端HiveShell方式(可以直接写SQL): bin/hiveHiveThriftServer方式(不可直接写SQL,需要外部客户端链接使用): ......
  • 多元线性回归预测MATLAB代码 代码注释清楚。 可以读取EXCEL数据,使用
    多元线性回归预测MATLAB代码代码注释清楚。可以读取EXCEL数据,使用换自己数据集。很方便,初学者容易上手。ID:8418656625367341......
  • 如何使用Java在Excel中实现一个数据透视表
    摘要:本文由葡萄城技术团队于博客园原创并首发。转载请注明出处:葡萄城官网,葡萄城为开发者提供专业的开发工具、解决方案和服务,赋能开发者。前一段时间淘宝出了一个“淘宝人生”的模块,可以看从注册淘宝账号至今的消费记录,仔细想了想,现在微信、淘宝这些APP好像都喜欢出这种记录使用......
  • Rust 使用egui创建一个简单的下载器demo
    仓库连接:https://github.com/GaN601/egui-demo-download-util这是我第一个rustguidemo,学习rust有挺长时间了,但是一直没有落实到实践中,本着对桌面应用的兴趣,考察了slint、egui两种框架,最后还是选择了egui.这篇博客同时包含我当前的一些理解,但是自身技术有限,可......
  • 面试官:使用 RocketMQ 怎么进行灰度发布?
    今天来聊一聊RocketMQ的灰度方案。灰度发布是指在黑与白之间,平滑过渡的一种发布方式。在大流量的系统中,如果一次升级改造范围比较大,或者影响内容不太确定,一般会采用切量的方式进行升级,这样可以减少生产变更带来的影响。如上图,对ServiceA这个服务进行升级,采用灰度发布,先升级Ser......
  • mysql中innodb的索引结构以及使用B+树实现索引的原因?
    在MySQL中,InnoDB引擎使用B+树数据结构来实现索引。B+树是一种平衡的多叉树,它具有以下优点:有序性:B+树的叶子节点是按照键值大小顺序存储的,这样可以方便地进行范围查询操作,提高查询效率。平衡性:B+树通过自动调整节点的分裂和合并来保持树的平衡,使得所有叶子节点到根节点的路径长度相......
  • requests的基础使用
    爬虫介绍#爬虫:又称网络蜘蛛,spider,一堆程序,从互联网中抓取数据----》数据清洗---->入库#爬虫需要掌握的知识 -抓取数据:发送网络请求(http),获得响应(http响应,响应头,响应体---》真正重要的数据在响应体中) -python模块:requests,selenium-清洗数据:解析拿回......
  • 微信小程序(三)列表渲染&数据绑定&事件绑定&路由跳转&生命周期&本地存储&模板使用
    这里新建个页面log,然后用这个页面进行测试。同时修改app.json,将log页面设置为首页"pages":["pages/index/index","pages/log/log"],"entryPagePath":"pages/log/log",0.数据绑定0.简单的绑定wxml用{{val}}取变量<!--pages/log/lo......
  • 7.10 requests的高级使用
    1. 自动携带cookie和session对象header={'Referer':'http://www.aa7a.cn/user.php?&ref=http%3A%2F%2Fwww.aa7a.cn%2F','User-Agent':'Mozilla/5.0(WindowsNT10.0;Win64;x64)AppleWebKit/537.36(KHTML,likeGecko)Chrome/114......