GORM 2.0 是一次彻底重写,带来了大量新特性、性能改进和破坏性变更,总结如下:
---
✅ 主要新特性与改进
特性类别 新增或改进内容
性能与模块化 性能显著提升,架构更模块化,支持插件化扩展 。
Context 支持 所有数据库操作支持 context.Context,日志也支持上下文追踪 。
批量操作 支持批量插入(CreateInBatches)和分批查询(FindInBatches) 。
预编译与 DryRun 支持预编译语句(PrepareStmt)和仅生成 SQL 不执行的 DryRun 模式 。
Joins 预加载 支持使用 INNER JOIN 的预加载方式,避免 N+1 问题 。
查询到 Map 支持将查询结果扫描到 map[string]interface{} 或 []map[string]interface{} 。
嵌套事务 支持 SavePoint、RollbackTo 等嵌套事务操作 。
SQL 构建增强 支持命名参数、分组条件、子查询、Upsert、锁、优化器提示等 。
关联模式增强 支持批量关联操作、关联删除、关联替换等 。
字段权限控制 支持字段级别的读写、创建、更新权限控制 。
自定义数据类型 更好支持 JSON 等自定义类型 。
插件系统 新的插件机制,支持读写分离、Prometheus 监控等官方插件 。
---
⚠️ 破坏性变更(Breaking Changes)
变更点 说明
导入路径变更 从 github.com/jinzhu/gorm 改为 gorm.io/gorm,驱动也独立为 gorm.io/driver/* 。
BlockGlobalUpdate 默认开启,禁止无条件的全局更新/删除,需手动开启 AllowGlobalUpdate 。
ErrRecordNotFound 只在 First, Last, Take 中返回,移除 RecordNotFound() 方法,需用 errors.Is 判断 。
Hooks 接口变更 所有钩子方法必须定义为 func(tx *gorm.DB) error,否则无效 。
软删除必须显式使用 gorm.DeletedAt 不再自动识别 DeletedAt 字段,需显式使用 gorm.DeletedAt 类型 。
事务链式调用线程安全 方法链共享 Statement,需使用 Session 或 WithContext 保证并发安全 。
更新结构体行为变化 使用 Select 才能更新零值字段,否则会被忽略 。
不再支持字段别名 不再支持 AS 关键字为字段起别名 。
---
✅ 升级建议
- 修改 import 路径为 gorm.io/gorm 和 gorm.io/driver/*。
- 检查所有钩子函数签名是否符合新规范。
- 替换 RecordNotFound() 为 errors.Is(err, gorm.ErrRecordNotFound)。
- 若使用软删除,确保字段类型为 gorm.DeletedAt。
- 更新事务和关联操作代码,避免并发问题。
---
如需进一步查看官方升级指南,可访问:[GORM 2.0 Release Note](https://gorm.io/docs/v2_release_note.html) 。