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.
PRO
December 12, 2024
Technology
1
280
GORM v1 → v2に移行したときの変更点/Changes when moving from GORM v1 to v2
登壇者名:上窪大暉
登壇したイベントタイトル:Go Connect #4
登壇したイベントのURL:
https://gotalk.connpass.com/event/336208/
株式会社ビットキー / Bitkey Inc.
PRO
December 12, 2024
Tweet
Share
More Decks by 株式会社ビットキー / Bitkey Inc.
See All by 株式会社ビットキー / Bitkey Inc.
【開発を止めるな】機能追加と並行して進めるアーキテクチャ改善/Keep Shipping: Architecture Improvements Without Pausing Dev
bitkey
PRO
1
230
“決まらない”NSM設計への処方箋 〜ビットキーにおける現実的な指標デザイン事例〜 / A Prescription for "Stuck" NSM Design: Bitkey’s Practical Case Study
bitkey
PRO
1
820
AI時代の戦略的アーキテクチャ 〜Adaptable AI をアーキテクチャで実現する〜 / Enabling Adaptable AI Through Strategic Architecture
bitkey
PRO
17
16k
Dev Containers と Skaffold で実現する クラウドネイティブ開発環境 ローカルのみという制約に挑む / Cloud-Native Development with Dev Containers and Skaffold: Tackling the Local-Only Constraint
bitkey
PRO
0
280
待つ、歩く、そして祈る -モバイルアプリの厄介なテスト奮闘記-/Wait, Walk, and Pray -The Troublesome Struggle of Mobile App Testing-
bitkey
PRO
1
120
見栄えと使いやすさの先にある 特別感 をデザインする / Designing a Sense of Specialness Beyond Aesthetics and Usability
bitkey
PRO
0
230
フレームワーク探しはもう終わり! チームに「ジャストフィット」するワークショップの作り方 / No More Framework Searching: How to Build a 'Just-Fit' Workshop for Your Team
bitkey
PRO
0
140
一次体験を起点にしたUX改善の取り組み / Direct Experience Driven UX Improvements
bitkey
PRO
0
330
ユーザー体験は細部に宿る -ウィジェットQAの挑戦と気づき- / UX is in the details: Challenges and Learnings from Widget QA
bitkey
PRO
0
130
Other Decks in Technology
See All in Technology
AWS re:Inventre:cap ~AmazonNova 2 Omniのワークショップを体験してきた~
nrinetcom
PRO
0
130
20251225_たのしい出張報告&IgniteRecap!
ponponmikankan
0
110
Digitization部 紹介資料
sansan33
PRO
1
6.4k
【Agentforce Hackathon Tokyo 2025 発表資料】みらいシフト:あなた働き方を、みらいへシフト。
kuratani
0
100
I tried making a solo advent calendar!
zzzzico
0
140
CQRS/ESになぜアクターモデルが必要なのか
j5ik2o
0
720
AIと融ける人間の冒険
pujisi
0
110
ESXi のAIOps だ!2025冬
unnowataru
0
490
名刺メーカーDevグループ 紹介資料
sansan33
PRO
0
1k
AIエージェントを5分で一気におさらい!AIエージェント「構築」元年に備えよう
yakumo
1
140
RALGO : AIを組織に組み込む方法 -アルゴリズム中心組織設計- #RSGT2026 / RALGO: How to Integrate AI into an Organization – Algorithm-Centric Organizational Design
kyonmm
PRO
3
880
Introduction to Bill One Development Engineer
sansan33
PRO
0
340
Featured
See All Featured
Become a Pro
speakerdeck
PRO
31
5.8k
What the history of the web can teach us about the future of AI
inesmontani
PRO
0
390
The B2B funnel & how to create a winning content strategy
katarinadahlin
PRO
0
230
Building Better People: How to give real-time feedback that sticks.
wjessup
370
20k
SEO for Brand Visibility & Recognition
aleyda
0
4.1k
Max Prin - Stacking Signals: How International SEO Comes Together (And Falls Apart)
techseoconnect
PRO
0
59
Fireside Chat
paigeccino
41
3.8k
For a Future-Friendly Web
brad_frost
180
10k
Performance Is Good for Brains [We Love Speed 2024]
tammyeverts
12
1.4k
Test your architecture with Archunit
thirion
1
2.1k
AI Search: Where Are We & What Can We Do About It?
aleyda
0
6.8k
The Straight Up "How To Draw Better" Workshop
denniskardys
239
140k
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