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

gorm2.0升级需要改哪些

升级 GORM 到 2.0 至少要改 5 个地方,下面按“必须改”和“建议改”两类列出,并给出最小可编译的示例,照着替换即可通过编译。

---

一、必须改的 5 处(不编译不过)
序号 老 1.x 写法 2.0 新写法 备注
1 import "github.com/jinzhu/gorm" import "gorm.io/gorm" 主库路径全变
2 import _ "github.com/jinzhu/gorm/dialects/mysql" import "gorm.io/driver/mysql" 驱动也独立
3 db, err := gorm.Open("mysql", dsn) db, err := gorm.Open(mysql.Open(dsn), &gorm.Config{}) 参数顺序/类型全变
4 if db.RecordNotFound() { … } if errors.Is(result.Error, gorm.ErrRecordNotFound) { … } 方法被移除
5 钩子函数签名任意 必须统一为 func(*gorm.DB) error 否则钩子不会生效
最小可编译启动示例(MySQL):
package main

import (
"gorm.io/driver/mysql"
"gorm.io/gorm"
)

type User struct {
ID uint
Name string
}

func main() {
dsn := "user:pass@tcp(127.0.0.1:3306)/test?charset=utf8mb4&parseTime=True&loc=Local"
db, err := gorm.Open(mysql.Open(dsn), &gorm.Config{})
if err != nil {
panic(err)
}
db.AutoMigrate(&User{})
}


---

二、建议继续改的 4 处(功能/性能更好)
老 1.x 习惯 2.0 推荐做法 原因
db.Find(&u).Update(&u) db.Model(&User{}).Where("id=?", id).Updates(map[string]interface{}{"name": "tom"}) 结构体更新默认忽略零值
全局更新无保护 默认禁止,需要 gorm.Config{AllowGlobalUpdate: true} 防止误伤全表
并发链式调用 使用 db.WithContext(ctx).Session(&gorm.Session{}) 2.0 共享 Statement,必须 Session 隔离
零值条件被忽略 用 map 或 Select("age") 强制更新 结构体查询/更新会跳过零值字段

---

三、全局钩子升级示例(可选)
若原来在 1.x 里用 BeforeSave,2.0 可以注册一次即可作用于全部模型:
db.Callback().Create().Before("gorm:before_create").
Register("global:before_create", func(tx *gorm.DB) error {
now := time.Now()
tx.Statement.SetColumn("CreatedAt", now)
return nil
})


---

四、一键检查清单
1. 全文搜索 github.com/jinzhu/gorm → 替换为 gorm.io/gorm
2. 全文搜索 gorm.Open("mysql" → 替换为 gorm.Open(mysql.Open(dsn), &gorm.Config{})
3. 全文搜索 .RecordNotFound() → 替换为 errors.Is(err, gorm.ErrRecordNotFound)
4. 所有钩子函数加上 func(*gorm.DB) error 签名
5. 重新 go mod tidy 拉取新依赖
完成以上 5 步即可通过编译;再继续把“建议改”的 4 处处理完,就真正享受 2.0 的全部新特性。祝升级顺利!

http://www.cnnetsun.cn/news/5265.html

相关文章:

  • Wan2.2-T2V-5B生成视频可用于保险理赔情景模拟
  • Wan2.2-T2V-A14B支持HDR输出吗?色彩空间与动态范围详解
  • 答辩PPT太难搞?这4个AI神器一键搞定,亲测能救命!
  • MFCMAPI 实战教程:从入门到精通的 MAPI 开发指南
  • Photoshop图层批量导出终极指南:10倍速提升设计效率
  • 東風破 plum:Rime输入法配置管理神器,开启个性化中文输入新时代
  • Wan2.2-T2V-A14B在社交媒体内容运营中的ROI分析
  • 斐讯N1双系统实战:OpenWrt路由与Android TV智能切换指南
  • Bitlocker密钥提取之深入分析TPM释放密钥VMK过程二
  • 6-1WPS JS宏 new Set集合的创建
  • Wan2.2-T2V-A14B在太空站内部环境模拟视频中的失重表现
  • Wan2.2-T2V-5B模型提供详细使用手册PDF下载
  • Komikku漫画阅读器:免费开源的终极阅读体验指南
  • 大模型备案自评估报告|合规路上的全面复盘,附关键要点梳理✨
  • 基于大数据的小说推荐与可视化分析系统毕业设计项目源码
  • Wan2.2-T2V-A14B结合Token计费模式的商业模式创新
  • Flomo到Obsidian迁移指南:3分钟掌握笔记无缝同步
  • Gesturefy:Firefox鼠标手势终极指南,让网页浏览效率翻倍
  • 千匠B2B商城系统,融合AI能力,助力渠道变革与降本增效
  • 终极小米运动自动刷步数完整指南:轻松实现微信支付宝步数同步
  • 【Docker Offload云端卸载实战】:掌握高效任务调度的5大核心技巧
  • 编写一个程序输入一个n×n的矩阵,求出两条对角线的元素值之和
  • QwQ-32B-AWQ:320亿参数大模型的效率革命,推理性能媲美DeepSeek-R1
  • PDF转Markdown神器:告别繁琐复制粘贴的终极解决方案
  • 中国互联网络信息中心赴国家顶级域名全球服务平台成都灾备数据中心开展实地调研
  • 收藏备用!大模型学习避坑指南,新手也能快速入门
  • 摆脱局域网束缚,Flowise 让 AI 工作流协作更自由
  • 搭建个人私有云盘?Nextcloud 让数据管理更自由,搭配cpolar远程访问无压力!
  • VIADO 工程下tcl的瘦身和恢复
  • 5分钟打造专属Windows状态栏:YASB让你的桌面焕然一新