GORM v2のBreaking Changまとめ

変更点まとめ

パスの変更

v1

    "github.com/jinzhu/gorm"
    _ "github.com/jinzhu/gorm/dialects/postgres"

v2

    "gorm.io/gorm"
    _ "gorm.io/driver/postgres"

Transactionがデフォルトで貼られるように

GORM v2ではTransactionを常時貼るようになってます

この機能をオフにするためには以下のようにします

v2

db, _ := gorm.Open(mysql.New(conn)), &gorm.Config{
                SkipDefaultTransaction: true,
            })

Relation関数の廃棄

Relation関数がなくなりました

なのでAssociationで代用してあげる必要があります。

ちなみにこのAssoctioanクラスの関数だけGoっぽくerrorが戻り値になっています

v1

if err := db.Model(&user).Related(project).Error; err != nil {

v2

tmp := db.Model(&user).Association("Project").Find(&Project{})

Scan/FindがErrorを返さないようになっている

Findの時にRecordNotFoundだとしてもエラーを出力しないようになっています。

なのでエラーハンドリングしたい場合はTakeやFirst、Lastを使う必要があります

v1

if err := db.Table(ProjectsTableName).Where("uuid = ?", uuid).Scan(archivedPj).Error; err != nil {

v2

if err := tx.Table(ProjectsTableName).Where("uuid = ?", uuid).Take(archivedPj).Error; err != nil {

RecordNotFoundのエラーハンドリング

v1

  if res.RecordNotFound() {   
        return c.NoContent(http.StatusNoContent)
    }

v2

    if errors.Is(res.Error, gorm.ErrRecordNotFound) {
        return c.NoContent(http.StatusNoContent)
    }

DBのオープン

v1

    db, err := gorm.Open("postgres", conn)

v2

    db, err := gorm.Open(postgres.Open(conn), &gorm.Config{})

LogModeの設定

Logの出力の設定が代わりました

true or false だけではなく、InfoやWarn、Errorなどログのレベルを選択できるようになっています

v1

    // true or false
    db.LogMode(true)    

v2

    // logger.Silent or logger.Info or logger.Warn or logger.Error
    db.logger.LogMode(logger.Error)

Updateの引数にモデルの構造体が渡せなくなりました

Updateは単一のカラム更新にのみ使うように変更されています。

v1

    if err := db.Model(&cis).Where("id = ?", id).Update(cis).Error

v2

    if err := db.Model(&cis).Where("id = ?", id).Updates(cis).Error

Countの型がintからint64へ

v1

var count int
db.Table("activities").Where("project_id = ?", pj.ID).Count(&count)

v2

var count int64
db.Table("activities").Where("project_id = ?", pj.ID).Count(&count)

Deleteの変更

テーブルの全削除する場合には明示的にAllowGlobalUpdateをtrueにする必要があります

v1

db.Delete(&model.Charge{})

v2

db.Session(&gorm.Session{AllowGlobalUpdate: true}).Delete(&model.Charge{})

コメントを残す