gorm.DeletedAt

发布时间:2026/9/14 23:16:11

gorm.DeletedAt gorm.DeletedAt是 GORM 用于实现软删除的特殊类型基于sql.NullTime或gorm.io/datatypes中的实现。基本特性表格特性说明类型本质sql.NullTime的扩展包含Time time.Time和Valid bool零值Validfalse表示记录未被删除删除时设置当前时间Validtrue查询时GORM 自动过滤Validtrue已删除的记录定义与使用goimport ( gorm.io/gorm time ) type User struct { ID uint gorm:primaryKey Name string CreatedAt time.Time UpdatedAt time.Time DeletedAt gorm.DeletedAt gorm:index // 软删除字段 }基本操作软删除不真正删除数据go// 删除用户设置 deleted_at 为当前时间 db.Delete(user) // SQL: UPDATE users SET deleted_at2026-07-24 08:23:00 WHERE id 1 // 批量软删除 db.Where(age ?, 60).Delete(User{})查询自动排除已删除go// 普通查询自动加 deleted_at IS NULL db.Find(users) // SQL: SELECT * FROM users WHERE deleted_at IS NULL db.First(user, 1) // SQL: SELECT * FROM users WHERE id 1 AND deleted_at IS NULL查询包含已删除的记录go// 使用 Unscoped 绕过软删除过滤 db.Unscoped().Find(users) // 查全部 db.Unscoped().First(user, 1) // 查单条包括已删除 // 只查已删除的 db.Unscoped().Where(deleted_at IS NOT NULL).Find(users)恢复软删除的记录go// 先找到记录包含已删除的 db.Unscoped().First(user, 1) // 恢复将 deleted_at 设为 NULL db.Model(user).Update(deleted_at, nil) // 或 db.Model(user).Update(deleted_at, gorm.DeletedAt{})永久删除go// 必须加 Unscoped否则只是软删除 db.Unscoped().Delete(user) // SQL: DELETE FROM users WHERE id 1与 null.Time 的关系go// gorm.DeletedAt 本质上就是 sql.NullTime 的别名扩展 type DeletedAt sql.NullTime // 所以它有 deletedAt.Time // 删除时间 deletedAt.Valid // true已删除, false未删除自定义软删除字段名gotype User struct { ID uint gorm:primaryKey Name string DeletedAt gorm.DeletedAt gorm:index;column:deleted_time // 自定义列名 }注意事项表格注意点说明必须加gorm:index否则查询性能差因为大部分查询都要过滤deleted_at IS NULL关联查询关联模型也会自动过滤已删除记录唯一索引软删除场景下唯一索引需要包含deleted_at否则删除后无法插入相同数据不兼容db.RowsAffected软删除返回的 RowsAffected 是更新数不是删除数唯一索引处理常见问题go// ❌ 错误这样删除后再插入相同 email 会报唯一冲突 type User struct { ID uint gorm:primaryKey Email string gorm:uniqueIndex DeletedAt gorm.DeletedAt gorm:index } // ✅ 正确唯一索引包含 deleted_at type User struct { ID uint gorm:primaryKey Email string gorm:uniqueIndex:idx_email_deleted DeletedAt gorm.DeletedAt gorm:uniqueIndex:idx_email_deleted }总结表格操作方法软删除db.Delete(user)查未删除db.Find(users)自动过滤查全部db.Unscoped().Find(users)恢复db.Model(user).Update(deleted_at, nil)永久删除db.Unscoped().Delete(user)
延伸阅读

更多相关文章

2026/9/11 12:20:19

思考极客与黑客精神的融合实践产物

思考极客与黑客精神的融合实践产物——QiLink**以前我给工程师写过一封大厂P7/P8的一封“劝退信”:与其做AI时代的耗材,不如来这里留份“家产”** 2026年了,如果你还在大厂的P序列里卷生卷死,那你可能还没意识到危机的严重性。 今…

2026/9/12 23:15:56

大模型学习路径:从零基础到工业级落地的实战指南

1. 大模型学习路径全景解析2026年的大模型技术发展已经进入深水区,从最初的文本生成到现在的多模态交互,技术栈的复杂度呈指数级增长。作为从业五年的AI工程师,我完整经历了从Transformer架构兴起到大模型工业化落地的全过程。这条学习路径不…

2026/9/14 0:01:00

《技术大败局》新能源汽车篇(更新2)

QiLinkOS报告:行业风险导航系列《技术大败局》新能源汽车篇(2)富比案:国内高科技知识产权第一案起因:400多人集体跳槽2003年起,比亚迪从做电池切入手机代工领域,直接动了富士康的蛋糕。郭台铭后来怒斥:"我们总共被…

2026/9/14 23:11:13

新机调试必做:个性化Word模板制作指南

新机调试这件事,我一般按“装系统—装基础软件—装Office—做模板”这个顺序来。很多人觉得装完Office就万事大吉,直接双击Word开始写东西,但恰恰是少了做模板这一步,后面大半年里所有文档的排版时间都会翻倍。所谓个性化Word模板…

2026/9/14 23:11:13

Office三件套崩溃问题分析与系统化修复方案

1. Office三件套崩溃问题的本质剖析当PowerPoint/Word/Excel突然弹出"很抱歉,遇到错误需要关闭"的对话框时,背后通常隐藏着三类典型问题:1.1 程序文件完整性受损Office应用程序由数千个相互依赖的组件构成。注册表项损坏、关键DLL文…

2026/9/14 23:11:13

Gitee PR 集成大模型:自建 AI 代码审计机器人实战指南

一聊到 AI 写代码,大家眼睛都亮了,可一聊到代码审查,团队的表情就变得微妙起来。我最近跟几个技术负责人交流,大家有个共同的感受:AI 编程助手让一次迭代的代码产出量翻了好几倍,可是 Review 还是那几个人&…

2026/9/14 23:06:13

人脸关键点检测小模型蒸馏实战:轻量高精度部署方案

简介:本资源是一套面向本科生与初学者的人脸关键点检测轻量化模型实战项目,聚焦知识蒸馏技术在模型压缩中的落地应用,适用于人工智能、计算机科学等专业学生的毕业设计、课程设计及算法进阶学习。压缩包含2000个文件,主体为997张人…

2026/9/14 2:17:50

拯救者Y7000黑屏故障排查与维修实战指南

1. 项目概述:一台黑屏的拯救者Y7000,到底卡在哪一步? 联想拯救者Y7000系列笔记本,从2018年第一代搭载i5-8300H开始,到后来的i7-9750H、i7-10750H、i5-11400H,再到2023年款的R7-7840HS,它始终是学…

2026/9/14 0:03:22

KCF目标跟踪算法与OTB工程实现:毕业设计实战解析

简介:这是一份基于KCF核相关滤波算法、融合尺度池与抗遮挡处理的目标检测跟踪MATLAB完整源码,主要面向计算机相关专业准备毕业设计、课程设计或期末大作业的学生,也适合需要项目实战练习的初学者。源码在OTB数据集上完成验证,能够…

2026/9/14 0:03:22

语音情感识别实战:Keras实现LSTM、CNN、SVM与MLP多模型对比

简介:面向语音情感识别入门与进阶开发者,这份基于Keras的项目源码完整实现了LSTM、CNN、SVM、MLP四种模型,兼容Python3.8与Keras/TensorFlow2环境。压缩包内含49个文件,大小约70.31MB,主体包括Python脚本、yaml/json配…

2026/9/14 11:59:31

USB Type-C PCB布局分区设计:电源、高速信号与PD协议全攻略

做硬件这行,Type-C接口算是典型的“看着简单,做起来全坑”的东西。光引脚就24个,高低速信号、电源、控制线全部塞在一个小小的连接器里,如果PCB布局不做规划,打样回来基本就是“插上没反应”、“高速掉线”、“静电一打…

2026/9/14 13:53:59

系统编程学习原型如何补齐稳定性边界

系统编程学习原型如何补齐稳定性边界预算有限时&#xff0c;我先优化明显多余的复制&#xff0c;而不是猜测性地换容器。用借用传递只读数据通常就能减少分配&#xff1a; fn parse(line: &str) -> Result<Item, Error> { /* ... */ }用基准确认热点确实在分配&am…

2026/9/14 11:22:57

雨花区哪家财务公司代理记账比较好?

在雨花区&#xff0c;企业处理财税事务常常面临诸多挑战&#xff0c;选择一家靠谱的财务公司至关重要。湖南巨勤财务管理咨询有限公司就是本地正规实体财税服务机构&#xff0c;深耕本地工商财税行业多年&#xff0c;熟悉当地工商局、税务局最新政策与申报流程。主营公司注册、…

还想了解更多?直接咨询顾问

免费诊断 + 免费方案 + 透明报价。

全国咨询热线400-8866-253
免费获取方案
咨询二维码