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
Sponsored
·
Your Podcast. Everywhere. Effortlessly.
Share. Educate. Inspire. Entertain. You do you. We'll handle the rest.
→
株式会社ビットキー / 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
270
“決まらない”NSM設計への処方箋 〜ビットキーにおける現実的な指標デザイン事例〜 / A Prescription for "Stuck" NSM Design: Bitkey’s Practical Case Study
bitkey
PRO
1
920
AI時代の戦略的アーキテクチャ 〜Adaptable AI をアーキテクチャで実現する〜 / Enabling Adaptable AI Through Strategic Architecture
bitkey
PRO
17
18k
Dev Containers と Skaffold で実現する クラウドネイティブ開発環境 ローカルのみという制約に挑む / Cloud-Native Development with Dev Containers and Skaffold: Tackling the Local-Only Constraint
bitkey
PRO
0
320
待つ、歩く、そして祈る -モバイルアプリの厄介なテスト奮闘記-/Wait, Walk, and Pray -The Troublesome Struggle of Mobile App Testing-
bitkey
PRO
1
130
見栄えと使いやすさの先にある 特別感 をデザインする / Designing a Sense of Specialness Beyond Aesthetics and Usability
bitkey
PRO
0
250
フレームワーク探しはもう終わり! チームに「ジャストフィット」するワークショップの作り方 / 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
370
ユーザー体験は細部に宿る -ウィジェットQAの挑戦と気づき- / UX is in the details: Challenges and Learnings from Widget QA
bitkey
PRO
0
140
Other Decks in Technology
See All in Technology
Codex 5.3 と Opus 4.6 にコーポレートサイトを作らせてみた / Codex 5.3 vs Opus 4.6
ama_ch
0
150
外部キー制約の知っておいて欲しいこと - RDBMSを正しく使うために必要なこと / FOREIGN KEY Night
soudai
PRO
12
5.5k
Tebiki Engineering Team Deck
tebiki
0
24k
顧客の言葉を、そのまま信じない勇気
yamatai1212
1
360
セキュリティについて学ぶ会 / 2026 01 25 Takamatsu WordPress Meetup
rocketmartue
1
300
会社紹介資料 / Sansan Company Profile
sansan33
PRO
15
400k
Introduction to Bill One Development Engineer
sansan33
PRO
0
360
AIエージェントを開発しよう!-AgentCore活用の勘所-
yukiogawa
0
170
【Oracle Cloud ウェビナー】[Oracle AI Database + AWS] Oracle Database@AWSで広がるクラウドの新たな選択肢とAI時代のデータ戦略
oracle4engineer
PRO
2
150
小さく始めるBCP ― 多プロダクト環境で始める最初の一歩
kekke_n
1
420
Azure Durable Functions で作った NL2SQL Agent の精度向上に取り組んだ話/jat08
thara0402
0
190
広告の効果検証を題材にした因果推論の精度検証について
zozotech
PRO
0
180
Featured
See All Featured
We Have a Design System, Now What?
morganepeng
54
8k
Product Roadmaps are Hard
iamctodd
PRO
55
12k
Agile that works and the tools we love
rasmusluckow
331
21k
Dealing with People You Can't Stand - Big Design 2015
cassininazir
367
27k
Groundhog Day: Seeking Process in Gaming for Health
codingconduct
0
93
The Limits of Empathy - UXLibs8
cassininazir
1
220
Speed Design
sergeychernyshev
33
1.5k
Building Adaptive Systems
keathley
44
2.9k
The SEO identity crisis: Don't let AI make you average
varn
0
260
Efficient Content Optimization with Google Search Console & Apps Script
katarinadahlin
PRO
1
320
Designing for Timeless Needs
cassininazir
0
130
Pawsitive SEO: Lessons from My Dog (and Many Mistakes) on Thriving as a Consultant in the Age of AI
davidcarrasco
0
67
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