记录 go 项目升级到 gorm v2 的一些修改。
gorm v2 项目地址 ,Release Note 。
go中引入是import "gorm.io/gorm"
连接数据库 db, err := gorm.Open("mysql", connString)改成db, err := gorm.Open(mysql.Open(connString), &gorm.Config{})
原来的db.LogMode(true)改成db.Logger = logger.Default.LogMode(logger.Info)
维护连接池 1 2 3 4 5 6 7 8 9 10 11 12 db.DB().SetMaxIdleConns(50 ) db.DB().SetMaxOpenConns(100 ) db.DB().SetConnMaxLifetime(time.Second * 30 ) sqlDB, err := db.DB() sqlDB.SetMaxIdleConns(50 ) sqlDB.SetMaxOpenConns(100 ) sqlDB.SetConnMaxLifetime(time.Second * 30 )
模型定义 在 v1 中我使用了一些 sql 的 tag,如sql:"not null",在 v2 里要改成gorm:"not null",用于指定外键的 tag 也变更了(Associations )。
数据迁移 这算是最大的变动了。
v1 我使用了AutoMigrate建表之后手动DB.Model(&Table{}).AddForeignKey添加外键。
v2 没有了AddForeignKey方法,自动迁移的表结构可以是这样的:
1 2 3 4 5 6 7 8 9 10 type Star struct { ID uint `gorm:"primary_key autoIncrement"` CreatedAt time.Time User User UserID uint `gorm:"not null"` Article Article ArticleID uint `gorm:"not null"` } db.AutoMigrate(&User{}, &Article{}, &Star{})
使用自动迁移,表中不可以有不是外键的关联。
手动设置外键约束见官方文档 ,还可以使用 Migrator 接口手动迁移。
Count Count 仅支持 *int64 作为参数
1 2 - total := 0 + var total int64
删除操作 1 2 3 4 5 6 7 8 9 10 v1 star := models.Star{ UserID: user.ID, ArticleID: service.ArticleID, } if err := models.DB.Delete(&star).Error; err != nil { v2 if err := models.DB.Where("article_id=? and user_id=?" , service.ArticleID, user.ID).Delete(&star).Error; err != nil {