Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Features
Speaker Deck
PRO
Sign in
Sign up for free
Search
Search
GORM v1 → v2に移行したときの変更点/Changes when moving fro...
Search
株式会社ビットキー / Bitkey Inc.
December 12, 2024
Technology
1
120
GORM v1 → v2に移行したときの変更点/Changes when moving from GORM v1 to v2
登壇者名:上窪大暉
登壇したイベントタイトル:Go Connect #4
登壇したイベントのURL:
https://gotalk.connpass.com/event/336208/
株式会社ビットキー / Bitkey Inc.
December 12, 2024
Tweet
Share
More Decks by 株式会社ビットキー / Bitkey Inc.
See All by 株式会社ビットキー / Bitkey Inc.
スキルだけでは満たせない、 “組織全体に”なじむオンボーディング/Onboarding that fits “throughout the organization” and cannot be satisfied by skills alone
bitkey
0
160
golangci-lint との つきあいかた/How to use golangci-lint
bitkey
0
71
複数ブランドを支える認証認可基盤における、 パスキー認証実装の課題と解決策/Challenges and Solutions for Passkey Authentication Implementation in AuthN and AuthZ Infrastructure Supporting Multiple Brands
bitkey
2
300
「遠くに行くならみんなで行け!」 チームみんなで進む為にやってきたこと/If you're going to go far, go together!” What we have done to advance together as a team
bitkey
2
99
え、 dep ってもう使わないの!? Go に帰ってきた人のキャッチアップ/What, you don't use dep anymore! Catching up with those returning to the Go language
bitkey
2
65
信頼されるためにやったこと、 やらなかったこと。/What we did to be trusted, What we did not do.
bitkey
0
2.8k
多領域インシデントマネジメントへの挑戦:ハードウェアとソフトウェアの融合が生む課題/Challenge to multidisciplinary incident management: Issues created by the fusion of hardware and software
bitkey
3
190
うまくいく! を実現するための質問力 / It works! The Power of Questions to Make It Happen
bitkey
1
390
ビットキーの中核を担うプロダクトで テスト自動化を駆使して安定的なリリースを実現する/At the core of BitKey's products Achieving stable releases through the use of test automation
bitkey
1
180
Other Decks in Technology
See All in Technology
ESXi で仮想化した ARM 環境で LLM を動作させてみるぞ
unnowataru
0
160
OPENLOGI Company Profile
hr01
0
60k
AWS Well-Architected Frameworkで学ぶAmazon ECSのセキュリティ対策
umekou
2
140
AWSアカウントのセキュリティ自動化、どこまで進める? 最適な設計と実践ポイント
yuobayashi
7
520
Two Blades, One Journey: Engineering While Managing
ohbarye
4
1.8k
AIエージェント入門
minorun365
PRO
30
17k
手を動かしてレベルアップしよう!
maruto
0
200
【5分でわかる】セーフィー エンジニア向け会社紹介
safie_recruit
0
18k
【内製開発Summit 2025】イオンスマートテクノロジーの内製化組織の作り方/In-house-development-summit-AST
aeonpeople
2
590
サイト信頼性エンジニアリングとAmazon Web Services / SRE and AWS
ymotongpoo
7
1.4k
依存パッケージの更新はコツコツが勝つコツ! / phpcon_nagoya2025
blue_goheimochi
3
210
偏光画像処理ライブラリを作った話
elerac
1
170
Featured
See All Featured
The World Runs on Bad Software
bkeepers
PRO
67
11k
Into the Great Unknown - MozCon
thekraken
35
1.6k
Product Roadmaps are Hard
iamctodd
PRO
50
11k
Unsuck your backbone
ammeep
669
57k
Making the Leap to Tech Lead
cromwellryan
133
9.1k
Rails Girls Zürich Keynote
gr2m
94
13k
Understanding Cognitive Biases in Performance Measurement
bluesmoon
27
1.6k
RailsConf & Balkan Ruby 2019: The Past, Present, and Future of Rails at GitHub
eileencodes
133
33k
For a Future-Friendly Web
brad_frost
176
9.6k
Automating Front-end Workflow
addyosmani
1368
200k
BBQ
matthewcrist
87
9.5k
A Philosophy of Restraint
colly
203
16k
Transcript
Copyright © Bitkey Inc. All rights reserved. GoConnect#4 GORM v1
→ v2に移行したときの変更点 株式会社ビットキー 上窪 大暉
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の改善 • インフラの保守・運用 登壇者について
Copyright © Bitkey Inc. All rights reserved. 3 1. GORMについて
2. v2移行の背景 3. 変更点 今日話すこと
Copyright © Bitkey Inc. All rights reserved. 4 GORMについて
Copyright © Bitkey Inc. All rights reserved. 5 GORMについて GORMとは
引用元: https://gorm.io/ja_JP/
Copyright © Bitkey Inc. All rights reserved. 6 • 機能が豊富なことをウリにしている
◦ レコード to 構造体へのマッピング ◦ クエリビルダー ◦ DBマイグレーション ◦ …etc • GoのORMとしては最もポピュラー ◦ スター数(*) ◦ Goのイベントで情報交換しての肌感 • v1とv2がある *...スライド作成時点(2024年11月末)で37,100でGoのORMではトップ GORMについて GORMの特徴
Copyright © Bitkey Inc. All rights reserved. 7 GORMについて GORMのv1とv2
引用元: https://gorm.io/ja_JP/docs/v2_release_note.html
Copyright © Bitkey Inc. All rights reserved. 8 GORMについて GORMのv1とv2
引用元: https://gorm.io/ja_JP/docs/v2_release_note.html
Copyright © Bitkey Inc. All rights reserved. 9 v2移行の背景
Copyright © Bitkey Inc. All rights reserved. 10 v2移行の背景 システム構成(簡易版)
Copyright © Bitkey Inc. All rights reserved. 11 v2移行の背景 システム構成(簡易版)
Copyright © Bitkey Inc. All rights reserved. 12 • v1のままになっていることによる実害はない
→ チームのタスクにはなっていない • できればv2に移行しておいた方がいい ◦ v1はもうメンテナンスされないので脆弱性対応が入らない ◦ v1ではcontextの伝搬(*)に対応していないが、v2では対応 ◦ サービスごとにバージョンが違うと管理しづらい *...`func (*DB) WithContext`というメソッドで有効にできる v2移行の背景 v2に完全移行したい
Copyright © Bitkey Inc. All rights reserved. 13 • スカンクワーク(*)という制度があるので毎週少しずつ進められた
◦ リリースまでは約2ヶ月ほど • 進め方 ◦ importの "github.com/jinzhu/gorm" を "gorm.io/gorm" に置換して go build し、落ちたところを直す ◦ 単体テストを実行して落ちたところを直す ◦ E2Eテストを実行して落ちたところを直す *...社員が本来やるべき業務以外の自主的活動のことで、Google社の20%ルールと似ている。 1週間スプリントである我々のチームでは毎週金曜日がスカンクに当たる v2移行の背景 どう進めたか
Copyright © Bitkey Inc. All rights reserved. 14 変更点
Copyright © Bitkey Inc. All rights reserved. 15 変更点 1.
コネクションの開け方 2. コネクションプールの設定方法 3. コネクションの閉じ方 4. エラーハンドリングの方法 5. Loggerの設定方法 6. Limit(), Offset() に渡す引数の型 7. byteaのゼロ値の取り扱い ※後半に行くにつれて対応難易度が上がります 修正が必要だった箇所は主に7つ
Copyright © Bitkey Inc. All rights reserved. 16 • `func
Open`のインターフェースが変更 ◦ v1: 引数にDSNを受け取る ◦ v2: 引数に`type Dialector`を受け取る 変更点 コネクションの開け方
Copyright © Bitkey Inc. All rights reserved. 17 変更点 コネクションの開け方
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を返す 変更点 コネクションプールの設定
Copyright © Bitkey Inc. All rights reserved. 19 変更点 コネクションプールの設定
Copyright © Bitkey Inc. All rights reserved. 20 • v1:
GORMの`func (*DB) Close`を使う • v2: database/sqlの`func (*DB) Close`を使う 変更点 コネクションの閉じ方
Copyright © Bitkey Inc. All rights reserved. 21 変更点 コネクションの閉じ方
Copyright © Bitkey Inc. All rights reserved. 22 変更点 エラーハンドリングの方法
引用元: https://pkg.go.dev/gorm.io/gorm#pkg-variables • `IsRecordNotFoundError()`という関数が廃止 • GORMが事前に定義しているエラーを`errors.Is()`の第二引数に渡して判定するよう変更
Copyright © Bitkey Inc. All rights reserved. 23 変更点 エラーハンドリングの方法
Copyright © Bitkey Inc. All rights reserved. 24 • Loggerを設定するタイミングが変更
◦ v1: `func Open`で受け取った`type DB`の`func (*DB) SetLoggerを呼び出す ◦ v2: `func Open`の引数`type Config`に`logger.Interface`を満たす構造体を含める 変更点 Loggerの設定
Copyright © Bitkey Inc. All rights reserved. 25 変更点 Loggerの設定
Copyright © Bitkey Inc. All rights reserved. 26 • 特に設定しなければGORMのデフォルトのLoggerが適用される
• チーム独自で運用しているLoggerライブラリをラップしたLoggerを実装して設定 変更点 Loggerの設定
Copyright © Bitkey Inc. All rights reserved. 27 • インターフェースが変更
◦ v1: 引数に`interface{}`を受け取る ◦ v2: 引数に`int`を受け取る • ページネーションを以下のようなドメインオブジェクトとして定義して usecase ↔ repositoryでやりとりしていたので影響あり 変更点 Limit(), Offset() に渡す引数の型
Copyright © Bitkey Inc. All rights reserved. 28 変更点 Q.
ドメインの定義を修正するか、repositoryの処理内でキャストするか A. repositoryの処理内でキャストする 理由: • `int`にしないといけないのはデータアクセス上の都合 • GORMをバージョンアップした影響でドメインに変更を加えるのは好ましくない Limit(), Offset() に渡す引数の型
Copyright © Bitkey Inc. All rights reserved. 29 変更点 Limit(),
Offset() に渡す引数の型
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のゼロ値
Copyright © Bitkey Inc. All rights reserved. 31 変更点 byteaのゼロ値
• v1の挙動を確認するテスト(抜粋)
Copyright © Bitkey Inc. All rights reserved. 32 変更点 byteaのゼロ値
• v2の挙動を確認するテスト(抜粋)
Copyright © Bitkey Inc. All rights reserved. 33 変更点 byteaのゼロ値
• テスト結果
Copyright © Bitkey Inc. All rights reserved. 34 • 検証結果からわかったこと
◦ `nil`をセットした時と`[]byte{}`をセットした時とでInsertされる値は変わらない → どちらも`\x`になる • 対応方針 ◦ `nil`を`[]byte{}`に書き換えるだけでOK 変更点 byteaのゼロ値
Copyright © Bitkey Inc. All rights reserved. 35 変更点 byteaのゼロ値
Copyright © Bitkey Inc. All rights reserved. 36 おわりに
Copyright © Bitkey Inc. All rights reserved. 37 おわりに まとめ
GORM v1 と v2 には互換性がない部分があるので移行する時は注意が必要! この発表がこれからGORM v2移行する方の参考になれば幸いです 💪
Copyright © Bitkey Inc. All rights reserved. 38 • 元記事の方もよろしくお願いします!
◦ じっくり見たい方 ◦ 参考文献へのリンクも欲しい方 【Go】GORM v1 → v2に完全移行した時の話 おわりに まとめ
Copyright © Bitkey Inc. All rights reserved. 39 会社紹介 ビットキーのミッション
Copyright © Bitkey Inc. All rights reserved. 40 会社・プロダクトの紹介 ハード・ソフトを自社で開発
×
Copyright © Bitkey Inc. All rights reserved. 41 会社紹介 We
are hiring! Engineering の求人一覧 カジュアル面談申込フォーム
Copyright © Bitkey Inc. All rights reserved. 42 End of
File