gorm.io/gorm
和 github.com/jinzhu/gorm
是 Go 语言 ORM 框架 GORM 的两个主要版本,分别对应 V2(新版)和 V1(旧版)。以下是它们的核心区别及迁移建议:
1. 版本历史
V1 (旧版)
仓库地址:github.com/jinzhu/gorm
维护状态: 已停止更新(最后版本为v1.9.16
),仅修复严重 Bug。V2 (新版)
仓库地址:gorm.io/gorm
维护状态: 活跃开发,新增大量功能并优化性能。
2. 主要区别
特性 | V1 (github.com/jinzhu/gorm ) |
V2 (gorm.io/gorm ) |
---|---|---|
模块支持 | 不支持 Go Modules(需手动管理依赖) | 原生支持 Go Modules |
上下文传递 | 无 Context 支持 | 支持 context.Context (如超时控制) |
关联查询性能 | Preload 效率较低 | Preload 优化,支持嵌套预加载 |
事务API | Begin , Commit , Rollback |
Transaction(func(tx *gorm.DB) error) (更简洁) |
钩子函数 | BeforeSave, AfterCreate等 | 保留并新增更多钩子(如 Before/After Update) |
SQL生成器 | Chainable API | Chainable API + Builder模式增强 |
Logger | 简单日志 | 可插拔 Logger(支持 Zap、Logrus等) |
数据库驱动 | 内置少量驱动 | 模块化驱动(需单独导入,如 gorm.io/driver/mysql ) |
3. V2 新增关键功能
- 批量插入/更新:
db.CreateInBatches(users, 100) // V2特有
- 子查询:
db.Where("amount > (?)", db.Table("orders").Select("AVG(amount)"))
db.Clauses(clause.OnConflict{UpdateAll: true}).Create(&user)
func ActiveUsers(db *gorm.DB) *gorm.DB {
return db.Where("active = ?", true)
}
db.Scopes(ActiveUsers).Find(&users)
4. V1 → V2迁移注意事项
- 驱动导入方式变化:
”`go // V1 import _ “github.com/jinzhu/gorm/dialects/mysql”
// V2 import (
"gorm.io/driver/mysql"
"gorm.io/gorm"
)
2. Open方法调整:
```go
// V1
db, err := gorm.Open("mysql", "user:pwd@/dbname")
// V2
dsn := "user:pwd@tcp(127.0.0.1:3306)/dbname?charset=utf8mb4&parseTime=True&loc=Local"
db, err := gorm.Open(mysql.Open(dsn), &gorm.Config{})
- Error处理差异:
- V2移除了
.RecordNotFound()
,改用标准错误判断:if errors.Is(err, gorm.ErrRecordNotFound) { ... }
- V2移除了
5.如何选择?
- ✅新项目:直接用
gorm.io/gorm
(V2)。
- ⚠️旧项目:逐步迁移到 V2,或维持现状(但不再接收新功能)。
如果需要具体的代码迁移示例或问题排查,可以告诉我你的场景!
内容由零声教学AI助手提供,问题来源于学员提问