Upgrade to Pro — share decks privately, control downloads, hide ads and more …

GORM v1 → v2に移行したときの変更点/Changes when moving fro...

GORM v1 → v2に移行したときの変更点/Changes when moving from GORM v1 to v2

登壇者名:上窪大暉
登壇したイベントタイトル:Go Connect #4
登壇したイベントのURL:https://gotalk.connpass.com/event/336208/

More Decks by 株式会社ビットキー / Bitkey Inc.

Other Decks in Technology

Transcript

  1. Copyright © Bitkey Inc. All rights reserved. GoConnect#4 GORM v1

    → v2に移行したときの変更点 株式会社ビットキー 上窪 大暉
  2. Copyright © Bitkey Inc. All rights reserved. 2 自己紹介 上窪

    大暉 (うえくぼ だいき) X: https://x.com/daikideal GitHub: https://github.com/daikideal Qiita: https://qiita.com/daikideal Zenn: https://zenn.dev/daikideal 略歴 • 2020年8月 エンジニアキャリアスタート • 2022年12月 ビットキーに入社 • 2023年10月 Cross Service Backendチームに異動 ◦ → 認証認可基盤を開発 今やっていること • バックエンドの開発 (Goを使用) • CI/CDの改善 • インフラの保守・運用 登壇者について
  3. Copyright © Bitkey Inc. All rights reserved. 3 1. GORMについて

    2. v2移行の背景 3. 変更点 今日話すこと
  4. Copyright © Bitkey Inc. All rights reserved. 6 • 機能が豊富なことをウリにしている

    ◦ レコード to 構造体へのマッピング ◦ クエリビルダー ◦ DBマイグレーション ◦ …etc • GoのORMとしては最もポピュラー ◦ スター数(*) ◦ Goのイベントで情報交換しての肌感 • v1とv2がある *...スライド作成時点(2024年11月末)で37,100でGoのORMではトップ GORMについて GORMの特徴
  5. Copyright © Bitkey Inc. All rights reserved. 7 GORMについて GORMのv1とv2

    引用元: https://gorm.io/ja_JP/docs/v2_release_note.html
  6. Copyright © Bitkey Inc. All rights reserved. 8 GORMについて GORMのv1とv2

    引用元: https://gorm.io/ja_JP/docs/v2_release_note.html
  7. Copyright © Bitkey Inc. All rights reserved. 12 • v1のままになっていることによる実害はない

    → チームのタスクにはなっていない • できればv2に移行しておいた方がいい ◦ v1はもうメンテナンスされないので脆弱性対応が入らない ◦ v1ではcontextの伝搬(*)に対応していないが、v2では対応 ◦ サービスごとにバージョンが違うと管理しづらい *...`func (*DB) WithContext`というメソッドで有効にできる v2移行の背景 v2に完全移行したい
  8. Copyright © Bitkey Inc. All rights reserved. 13 • スカンクワーク(*)という制度があるので毎週少しずつ進められた

    ◦ リリースまでは約2ヶ月ほど • 進め方 ◦ importの "github.com/jinzhu/gorm" を "gorm.io/gorm" に置換して go build し、落ちたところを直す ◦ 単体テストを実行して落ちたところを直す ◦ E2Eテストを実行して落ちたところを直す *...社員が本来やるべき業務以外の自主的活動のことで、Google社の20%ルールと似ている。  1週間スプリントである我々のチームでは毎週金曜日がスカンクに当たる v2移行の背景 どう進めたか
  9. Copyright © Bitkey Inc. All rights reserved. 15 変更点 1.

    コネクションの開け方 2. コネクションプールの設定方法 3. コネクションの閉じ方 4. エラーハンドリングの方法 5. Loggerの設定方法 6. Limit(), Offset() に渡す引数の型 7. byteaのゼロ値の取り扱い ※後半に行くにつれて対応難易度が上がります 修正が必要だった箇所は主に7つ
  10. Copyright © Bitkey Inc. All rights reserved. 16 • `func

    Open`のインターフェースが変更 ◦ v1: 引数にDSNを受け取る ◦ v2: 引数に`type Dialector`を受け取る 変更点 コネクションの開け方
  11. Copyright © Bitkey Inc. All rights reserved. 18 • GORMはdatabase/sqlの`sql.DB`を使ってコネクションプールを保持する

    • `gorm.DB`から`sql.DB`を取得する`func (*DB) DB`の戻り値が変更 ◦ v1: `*sql.DB`を返す ◦ v2: `*sql.DB`とerrorを返す 変更点 コネクションプールの設定
  12. Copyright © Bitkey Inc. All rights reserved. 20 • v1:

    GORMの`func (*DB) Close`を使う • v2: database/sqlの`func (*DB) Close`を使う 変更点 コネクションの閉じ方
  13. Copyright © Bitkey Inc. All rights reserved. 22 変更点 エラーハンドリングの方法

    引用元: https://pkg.go.dev/gorm.io/gorm#pkg-variables • `IsRecordNotFoundError()`という関数が廃止 • GORMが事前に定義しているエラーを`errors.Is()`の第二引数に渡して判定するよう変更
  14. Copyright © Bitkey Inc. All rights reserved. 24 • Loggerを設定するタイミングが変更

    ◦ v1: `func Open`で受け取った`type DB`の`func (*DB) SetLoggerを呼び出す ◦ v2: `func Open`の引数`type Config`に`logger.Interface`を満たす構造体を含める 変更点 Loggerの設定
  15. Copyright © Bitkey Inc. All rights reserved. 26 • 特に設定しなければGORMのデフォルトのLoggerが適用される

    • チーム独自で運用しているLoggerライブラリをラップしたLoggerを実装して設定 変更点 Loggerの設定
  16. Copyright © Bitkey Inc. All rights reserved. 27 • インターフェースが変更

    ◦ v1: 引数に`interface{}`を受け取る ◦ v2: 引数に`int`を受け取る • ページネーションを以下のようなドメインオブジェクトとして定義して usecase ↔ repositoryでやりとりしていたので影響あり 変更点 Limit(), Offset() に渡す引数の型
  17. Copyright © Bitkey Inc. All rights reserved. 28 変更点 Q.

    ドメインの定義を修正するか、repositoryの処理内でキャストするか A. repositoryの処理内でキャストする 理由: • `int`にしないといけないのはデータアクセス上の都合 • GORMをバージョンアップした影響でドメインに変更を加えるのは好ましくない Limit(), Offset() に渡す引数の型
  18. Copyright © Bitkey Inc. All rights reserved. 30 • Goの`[]byte`はPostgreSQLのbytea型として保存できる

    • NOT NULL制約つきのbytea型のカラムにnilを入れた時の挙動に差異あり ◦ v1: `\x`(*)としてInsertされる ◦ v2: NOT NULL制約違反エラーが発生する • 原因がわからなかったのでテストコードで検証 ◦ https://github.com/daikideal/gorm-demo もし原因をご存知の方がいらっしゃいましたら教えていただけると嬉しいです 🙇 *...空のbytea。Postgresはバイナリ列をSQLフォーマットで入出力するとき文字列に変換するが、 このときデフォルトで使われるのがhex書式で、`\x`が文字列の先頭につく。 参考: https://www.postgresql.jp/docs/9.4/datatype-binary.html 変更点 byteaのゼロ値
  19. Copyright © Bitkey Inc. All rights reserved. 34 • 検証結果からわかったこと

    ◦ `nil`をセットした時と`[]byte{}`をセットした時とでInsertされる値は変わらない → どちらも`\x`になる • 対応方針 ◦ `nil`を`[]byte{}`に書き換えるだけでOK 変更点 byteaのゼロ値
  20. Copyright © Bitkey Inc. All rights reserved. 37 おわりに まとめ

    GORM v1 と v2 には互換性がない部分があるので移行する時は注意が必要! この発表がこれからGORM v2移行する方の参考になれば幸いです 💪
  21. Copyright © Bitkey Inc. All rights reserved. 38 • 元記事の方もよろしくお願いします!

    ◦ じっくり見たい方 ◦ 参考文献へのリンクも欲しい方 【Go】GORM v1 → v2に完全移行した時の話 おわりに まとめ
  22. Copyright © Bitkey Inc. All rights reserved. 41 会社紹介 We

    are hiring! Engineering の求人一覧 カジュアル面談申込フォーム