升级gorm v2

记录 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
//v1:
//空闲
db.DB().SetMaxIdleConns(50)
//打开
db.DB().SetMaxOpenConns(100)
//超时
db.DB().SetConnMaxLifetime(time.Second * 30)
//v2:
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 {