Lock in $30 Savings on PRO—Offer Ends Soon! ⏳
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
270
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.
“決まらない”NSM設計への処方箋 〜ビットキーにおける現実的な指標デザイン事例〜 / A Prescription for "Stuck" NSM Design: Bitkey’s Practical Case Study
bitkey
PRO
1
580
AI時代の戦略的アーキテクチャ 〜Adaptable AI をアーキテクチャで実現する〜 / Enabling Adaptable AI Through Strategic Architecture
bitkey
PRO
16
15k
Dev Containers と Skaffold で実現する クラウドネイティブ開発環境 ローカルのみという制約に挑む / Cloud-Native Development with Dev Containers and Skaffold: Tackling the Local-Only Constraint
bitkey
PRO
0
220
待つ、歩く、そして祈る -モバイルアプリの厄介なテスト奮闘記-/Wait, Walk, and Pray -The Troublesome Struggle of Mobile App Testing-
bitkey
PRO
1
110
見栄えと使いやすさの先にある 特別感 をデザインする / Designing a Sense of Specialness Beyond Aesthetics and Usability
bitkey
PRO
0
210
フレームワーク探しはもう終わり! チームに「ジャストフィット」するワークショップの作り方 / No More Framework Searching: How to Build a 'Just-Fit' Workshop for Your Team
bitkey
PRO
0
130
一次体験を起点にしたUX改善の取り組み / Direct Experience Driven UX Improvements
bitkey
PRO
0
310
ユーザー体験は細部に宿る -ウィジェットQAの挑戦と気づき- / UX is in the details: Challenges and Learnings from Widget QA
bitkey
PRO
0
120
ハードウェアとソフトウェアをつなぐ全てを内製している企業の E2E テストの作り方 / How to create E2E tests for a company that builds everything connecting hardware and software in-house
bitkey
PRO
1
470
Other Decks in Technology
See All in Technology
ML PM Talk #1 - ML PMの分類に関する考察
lycorptech_jp
PRO
1
720
生成AI・AIエージェント時代、データサイエンティストは何をする人なのか?そして、今学生であるあなたは何を学ぶべきか?
kuri8ive
2
2.1k
プロダクトマネジメントの分業が生む「デリバリーの渋滞」を解消するTPMの越境
recruitengineers
PRO
3
720
非CUDAの悲哀 〜Claude Code と挑んだ image to 3D “Hunyuan3D”を EVO-X2(Ryzen AI Max+395)で動作させるチャレンジ〜
hawkymisc
1
160
ガバメントクラウド利用システムのライフサイクルについて
techniczna
0
180
GitLab Duo Agent Platformで実現する“AI駆動・継続的サービス開発”と最新情報のアップデート
jeffi7
0
210
AI時代の開発フローとともに気を付けたいこと
kkamegawa
0
2.2k
re:Invent2025 コンテナ系アップデート振り返り(+CloudWatchログのアップデート紹介)
masukawa
0
310
AWS Bedrock AgentCoreで作る 1on1支援AIエージェント 〜Memory × Evaluationsによる実践開発〜
yusukeshimizu
6
370
Snowflakeでデータ基盤を もう一度作り直すなら / rebuilding-data-platform-with-snowflake
pei0804
2
720
Reinforcement Fine-tuning 基礎〜実践まで
ch6noota
0
160
Security Diaries of an Open Source IAM
ahus1
0
130
Featured
See All Featured
Practical Orchestrator
shlominoach
190
11k
Into the Great Unknown - MozCon
thekraken
40
2.2k
The Success of Rails: Ensuring Growth for the Next 100 Years
eileencodes
47
7.8k
[RailsConf 2023] Rails as a piece of cake
palkan
58
6.1k
Understanding Cognitive Biases in Performance Measurement
bluesmoon
32
2.7k
How to train your dragon (web standard)
notwaldorf
97
6.4k
Side Projects
sachag
455
43k
Optimising Largest Contentful Paint
csswizardry
37
3.5k
GraphQLとの向き合い方2022年版
quramy
50
14k
Code Review Best Practice
trishagee
74
19k
The Straight Up "How To Draw Better" Workshop
denniskardys
239
140k
Producing Creativity
orderedlist
PRO
348
40k
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