ZBLOG

gorm.io/gorm和github.com/jinzhu/gorm 区别

gorm.io/gormgithub.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迁移注意事项

  1. 驱动导入方式变化:
    ”`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{})
  1. Error处理差异:
    • V2移除了.RecordNotFound(),改用标准错误判断:
      
      if errors.Is(err, gorm.ErrRecordNotFound) { ... }
      

5.如何选择?

  • ✅新项目:直接用 gorm.io/gorm (V2)。
  • ⚠️旧项目:逐步迁移到 V2,或维持现状(但不再接收新功能)。

如果需要具体的代码迁移示例或问题排查,可以告诉我你的场景!


内容由零声教学AI助手提供,问题来源于学员提问

本站部分文章来源于网络,版权归原作者所有,如有侵权请联系站长删除。
转载请注明出处:https://golang.0voice.com/?id=24012

分享:
扫描分享到社交APP
上一篇
下一篇
发表列表
游客 游客
此处应有掌声~
评论列表

还没有评论,快来说点什么吧~

联系我们

在线咨询: 点击这里给我发消息

微信号:3007537140

上班时间: 10:30-22:30

关注我们
x

注册

已经有帐号?