当前位置: 首页 > article >正文

gorm 中的Updates Update, Save,Create , UpdateColumn 区别与联系

在 GORMGo 的 ORM 库中Updates、Update、Save、Create、UpdateColumn等方法都用于数据的写入或更新但它们的行为、触发的钩子Hooks、性能、适用场景有显著区别。以下是详细对比与联系:一、核心方法对比表方法用途是否触发 Hooks是否支持批量是否跳过零值是否需要主键备注Create插入新记录✅BeforeCreate,AfterCreate❌单条✅CreateInBatches批量❌插入所有字段❌自动生成 IDSave智能保存存在则更新否则插入✅ 全部 HooksBeforeCreate/Update,After...❌单条❌更新所有非零字段✅更新时需主键最“重”的操作慎用Update更新单个字段❌不触发BeforeUpdate❌✅可更新为零值✅或配合Where如Update(name, new)Updates更新多个字段⚠️仅当传 struct 时触发❌传map不触发✅配合Where✅struct 会跳过零值map 不会✅或配合Where最常用批量更新方式UpdateColumn强制更新字段包括零值❌✅❌强制更新含零值✅或配合Where绕过 GORM 安全机制二、逐个详解1.Createdb.Create(user)作用插入一条新记录。特点忽略主键自增或 UUID插入所有字段包括零值如,0触发BeforeCreate/AfterCreate不适用已有主键的记录可能报错或行为未定义2.Savedb.Save(user) // user.Id ! 0 → 更新user.Id 0 → 插入作用根据主键是否存在自动决定是INSERT还是UPDATE特点更新时会更新所有非零字段零值字段会被忽略⚠️ 常见坑触发完整 HooksBeforeCreate/BeforeUpdate等必须有主键才能更新。缺点性能差先查不一定但逻辑复杂零值字段无法更新比如想把name改成不行建议除非明确需要“智能保存”否则避免使用3.Update单字段db.Model(User{}).Where(id ?, 1).Update(name, new) // 或 db.Model(user).Update(name, new)作用更新单个字段特点不触发BeforeUpdate可更新为零值如Update(age, 0)有效必须配合Model()Where()或已有主键适用简单单字段更新4.Updates多字段(a)传map最常用db.Model(User{}).Where(id ?, 1).Updates(map[string]interface{}{ name: new, age: 0, })不触发 Hooks不会跳过零值age: 0会被更新高效适合批量更新(b) 传structdb.Model(User{}).Where(id ?, 1).Updates(User{Name: new, Age: 0})会触发BeforeUpdate/AfterUpdate会跳过零值字段Age: 0被忽略如果想更新零值需用指针或sql.NullInt64等关键区别Updates(map)vsUpdates(struct)行为完全不同5.UpdateColumndb.Model(User{}).Where(id ?, 1).UpdateColumn(name, )作用强制更新字段即使值为零值。不触发任何 Hooks绕过 GORM 的安全检查如字段不存在也会拼 SQL可能报错批量更新零值的唯一可靠方式⚠️ 危险慎用确保字段名正确三、钩子Hooks触发规则总结方法触发BeforeUpdate?Save(struct)✅Updates(struct{})✅Updates(map[...])❌Update(field, value)❌UpdateColumn(...)❌Create✅BeforeCreate核心原则只有通过struct 实例更新且 GORM 能识别为模型操作才会触发 Hooks在 GORM 中使用Updates时是否触发 Hooks如BeforeUpdate/AfterUpdate与是否开启事务无关不仅看Updates的参数类型还看Model()是否绑定了一个 struct 实例 ,传入的是map还是struct结论只要用map[string]interface{}调用Updates无论是否在事务中都不会触发任何 Hooks。这是 GORM 的设计行为事务不影响钩子的触发逻辑临时跳过钩子使用原生 SQL或Session 模式如果模型已经定义了钩子但某些特定操作想跳过钩子可以方法一使用Session(gorm.Session{SkipHooks: true})db.Session(gorm.Session{SkipHooks: true}).Create(user) db.Session(gorm.Session{SkipHooks: true}).Save(user) db.Session(gorm.Session{SkipHooks: true}).Delete(user)⚠️ 注意SkipHooks: true会跳过所有钩子包括BeforeCreate、AfterCreate等但不会跳过AfterFind因为AfterFind是在查询后自动调用的与写操作无关。方法二使用原生 SQL完全绕过 GORM 模型机制db.Exec(INSERT INTO users (name) VALUES (?), Alice)这种方式不会触发任何 GORM 钩子因为没有使用模型的 Create/Save 等方法四、如何选择场景推荐方法插入新记录Create更新部分字段含零值批量Updates(map) 手动设updated_at更新部分字段需触发BeforeUpdateUpdates(struct{})注意零值问题强制更新字段为零值UpdateColumn不确定是新增还是更新避免Save改用FirstOrCreate 显式更新单字段更新Update(field, value)五、最佳实践建议批量更新不要依赖 Hooks显式设置updated_at、updated_by避免使用Save除非你完全理解其零值行为Updates(map)是最安全高效的批量更新方式如果BeforeUpdate只是用来设时间戳直接在业务层赋值比依赖钩子更可靠想更新零值用map或UpdateColumn别用 struct

相关文章:

gorm 中的Updates Update, Save,Create , UpdateColumn 区别与联系

在 GORM(Go 的 ORM 库)中Updates、Update、Save、Create、UpdateColumn 等方法都用于数据的写入或更新,但它们的行为、触发的钩子(Hooks)、性能、适用场景有显著区别。以下是详细对比与联系:一、核心方法对比表方法用途…...

错误弹窗记录

public partial class ErrorForm : Form{private static string error_str "系统错误";public ErrorForm(){InitializeComponent();pictureBox1.Image SystemIcons.Error.ToBitmap();pictureBox1.SizeMode PictureBoxSizeMode.StretchImage;label1.Text Error_st…...

从CUDA到MUSA(四):GPU架构揭秘——从Warp到Occupancy

引言:从代码到硬件的深层理解 在前三篇博客中,我们完成了GPU编程的"入门三部曲":理解异构计算的设计哲学、编写第一个向量加法程序、掌握多维线程组织与数据映射。至此,你已经能够写出正确的GPU程序。 但正确只是起点。…...

2026 年四可改造最后期限!这些省份必须完成

摘要:2026 年是分布式光伏四可改造的关键年份,多个省份明确最后完成期限。本文汇总 45 省市四可改造政策时间要求,帮您快速了解所在地区截止时间、改造要求和未完成后果。建议收藏备用!关键词:四可改造、2026 年、最后…...

计算机毕业设计springboot校园智能卡管理系统设计与实现 高校一卡通数字化管理平台的设计与实现 基于Spring Boot框架的校园智慧卡服务系统开发

计算机毕业设计springboot校园智能卡管理系统设计与实现8wbp89(配套有源码 程序 mysql数据库 论文) 本套源码可以在文本联xi,先看具体系统功能演示视频领取,可分享源码参考。随着高校信息化建设的深入推进,传统校园卡管理模式已难…...

Dify 模型供应商下载失败解决办法

问题现象: 部署或使用 Dify 时,模型供应商(如 OpenAI、Anthropic 等)的依赖包下载失败,提示网络连接超时或资源不可用。 原因定位: langgenius/dify: Production-ready platform for agentic workflow dev…...

音叉这玩意儿在光热振动里真是妙啊,特别是用COMSOL建模的时候,玩参数就像调电子琴的旋钮。先给你们看段核心参数设置代码

COMSOL仿真模型音叉光热致振动光源频率、光斑直径、光斑位置可调,特征频率振型model.param.set(f0, 32[Hz], 基准频率) model.param.set(d_spot, 20[um], 光斑直径) model.param.set(x_pos, 0.5*L_tine, 光斑横向位置) 这三个参数直接决定了音叉会不会"唱歌&qu…...

java基于微信小程序的物流仓储管理系统 可视化

目录系统架构设计核心功能模块划分技术实现路径性能优化策略测试验证方案部署运维建议项目技术支持可定制开发之功能创新亮点源码获取详细视频演示 :文章底部获取博主联系方式!同行可合作系统架构设计 采用前后端分离架构,前端使用微信小程序…...

数据中台数据权限体系:基于RBAC的精细控制

数据中台数据权限体系:基于RBAC的精细控制 关键词:数据中台、数据权限、RBAC、访问控制、数据安全、权限管理、数据治理 摘要:本文深入探讨了数据中台环境下基于RBAC(基于角色的访问控制)的数据权限体系设计与实现。文章首先介绍了数据中台权限管理的核心挑战,然后详细解析…...

污水处理施耐德TM218 PLC程序开发与分享

污水处理施耐德TM218PLC程序,SoMachine V4.3软件设计,带软件下载链接,带io分配和注释最近做了一个污水处理相关的施耐德TM218 PLC项目,用SoMachine V4.3软件进行设计,在这里和大家分享一下整个过程,还会给出…...

9大主流CRM核心能力对比:从线索到报表的全流程专业解析

9大主流CRM核心能力横向对比:从线索到报表的全流程专业解析CRM(客户关系管理)的核心价值在于将“客户”从零散数据转化为可运营的资产,其能力边界覆盖“线索获取-客户运营-商机转化-订单交付-数据复盘”的全生命周期。本文基于线索…...

别让AI把你带沟里:调教这货帮你写代码的实战指南

现在这年头,写代码要是没个AI傍身,出门都不好意思跟人打招呼。GitHub Copilot、ChatGPT、Claude……这些名字一个个听着跟漫威英雄似的。很多哥们儿心想:“这下稳了,以后我只要动动嘴,代码让AI写,我负责躺平…...

ChurchCRM SQL注入漏洞(CNVD-2026-12565、CVE-2026-24854)

ChurchCRM 是一款开源的教堂客户关系管理系统,采用 PHP 开发,支持成员管理、贡献跟踪、事件安排及多语言沟通等功能。系统界面友好,操作简单,且提供详尽文档与活跃社区支持,助力教堂高效管理日常运营。 国家信息安全漏…...

Spring面试高频题:从基础到源码,通俗拆解+避坑指南

本文拒绝晦涩难懂的源码堆砌,用“通俗类比细节拆解面试真题”的方式,把Spring面试中最常考、最易踩坑的知识点讲透,不管是初级面试还是中级面试,都能直接套用,帮你轻松拿下Spring相关考题。一、Spring基础认知&#xf…...

使用yolov26实现目标检测

一、创建虚拟环境 打开anaconda,选择Anaconda Prompt。 创建一个新的python环境,这里以yolov26命名新建环境,python使用3.12。 conda create -n yolo26 python3.12 回车后出现新建环境提醒输入 y 继续,耐心等待全部下载完成后自…...

从入门到精通:Kafka核心原理与实战避坑指南

在分布式系统中,消息队列是实现高可用、高并发、解耦的核心组件,而Kafka作为当下最流行的分布式消息队列之一,凭借高吞吐量、高可靠性、可扩展性等优势,广泛应用于日志收集、消息分发、流处理等场景。无论是后端开发、大数据处理&…...

Unity网络基础UDP客户端

第一部分:核心概念预习在看代码之前,你需要明白这几个核心概念:UDP (User Datagram Protocol):就像寄明信片。你只管把信发出去,不需要先跟对方建立连接,速度极快,但不保证对方一定能收到&#…...

feed二级缓存设计day05

背景:feed流:投喂流,主动把消息发给我们,类似于朋友圈别人的消息组成了我的主页feed流与内容详情是该社区访问最多的接口,面临着以下挑战:- **高并发读压力**:首页 Feed 与热门内容详情同一时刻…...

SpringBoot+Vue 办公信息系统管理平台源码免费分享【适合毕设/课设/学习】Java+Vue+MySQL

【源码在文章最后】 ## 项目概述 办公自动化系统(Office Automatic System,简称OA)是一个基于Spring Boot和Vue.js的企业级办公管理平台,旨在提高企业内部办公效率,实现办公流程的数字化和自动化。 ## 项目信息 - *…...

新能源汽车车载双向OBC,PFC,LLC,V2G 双向充电桩MATLAB仿真模型及应用分析

新能源汽车车载双向OBC,PFC,LLC,V2G 双向 充电桩 电动汽车 车载充电机 充放电机 MATLAB仿真模型 : (1)基于V2G技术的双向AC/DC、DC/DC充放电机MATLAB仿真模型; (2)前级电路为双向AC/…...

基于单片机的药品分拣系统

一、系统介绍 目前,随着当今社会老龄化进程的逐步加剧,我们在新闻中经常能看到老人跌倒了,无人扶,进而导致老人的死亡。对于这种悲剧,我们也很无奈,因为怕扶了老人,可能会被讹,老年人…...

qmt之如何用局部极值寻找支撑位和压力位(下)

书接上回,上一节是原理讲解,这里开始实战。实战Python代码:使用argrelextrema寻找压力支撑下面的示例代码使用了 Python 的 scipy.signal.argrelextrema 来寻找局部极值,并绘制成可视化图表。结果如下:代码解析&#x…...

国内外主流AI产品的能力矩阵解构,不同用户该怎么选择?

026年了,AI早就不是什么新鲜词儿了,它已经变成了我们工作和生活里的“搭子”。但说实话,现在的AI产品多到让人眼花缭乱,国内外各种工具层出不穷,选错了不仅浪费时间,还可能踩坑。今天我们就来唠唠现在市面上…...

吐血整理,性能测试总结分析,快速上手打通(一)

目录:导读 前言一、Python编程入门到精通二、接口自动化项目实战三、Web自动化项目实战四、App自动化项目实战五、一线大厂简历六、测试开发DevOps体系七、常用自动化测试工具八、JMeter性能测试九、总结(尾部小惊喜) 前言 1、性能测试的测试…...

实测,2分钟完成OpenClaw部署全攻略,ToClaw傻瓜式安装

实测,2分钟完成OpenClaw部署全攻略,ToClaw傻瓜式安装最近,一只名叫OpenClaw的“龙虾”彻底火了——火到二手平台出现上门安装服务,腾讯大厦门口排起长队,甚至官媒都在热议。但传统的部署方式却让多数人望而却步&#x…...

给小龙虾装上业务大脑:两个 SKILL 让 OpenClaw 学会查数和归因

全网都在教小龙虾点外卖,我们让它算清了 GMV 为什么跌。这篇文章是配套的上手指南——从安装到提问到进阶调教,手把手带你跑通。 我们把小龙虾接上了 Aloudata CAN 语义层。六轮对话,从「上月销售额多少」一路追到「江西电商渠道销售额环比下…...

conda管理包还是pip管理包

1. Conda会自动处理依赖冲突我是用使用的是conda环境来python虚拟环境的,我创建了一个名叫ai的环境,我第一次进入环境后,先使用pip安装了一些包,然后发现由于版本冲突原因而下载失败,然后我又使用conda命令去下载这些包…...

基于SMO滑模观测器的异步电机无传感器矢量控制研究:Matlab仿真模型分析

基于SMO滑模观测器的异步电机无传感器矢量控制,matlab,仿真模型。无感矢量控制在工业界被玩得越来越溜,最近在实验室调了套基于滑模观测器(SMO)的方案。这玩意儿最大的爽点就是不需要速度传感器,靠算法硬怼…...

【Kotlin】快速理解协程

文章目录一、预备知识1.1 同步和异步1.1.1 同步1.1.2 异步1.2 异步编程1.2.1 异步编程的困境1.2.2 解决方案二、协程2.1 什么是协程2.1.1 协程的定义2.1.2 协程的特点2.2 结构化并发2.2.1 核心原则2.2.2 实现机制:Job 层次结构2.3 协程的基本概念2.3.1 协程和挂起函…...

南京租打印机别踩坑!押金透明、退机不扯皮才是王道

“很多企业以为‘租打印机只是看价格’,却忽略了押金和退机环节可能埋下的‘隐形坑’——这正是南京打印机复印机租赁市场中,专业服务商与普通商家的核心区别。”南京打印机复印机租赁:押金透明是专业服务的基础在南京打印机复印机租赁市场&a…...