Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Sign up for free
Menu
Search
Features
All features
Private URLs
Password Protection
Custom URLS
Scheduled publishing
Remove Branding
Restrict embedding
Deck Collections
Notes
Features
All features
Private URLs
Password Protection
Custom URLS
Scheduled publishing
Remove Branding
Restrict embedding
Deck Collections
Notes
Explore
Featured decks
Featured speakers
Programming
Technology
Storyboards
Explore
Featured decks
Featured speakers
Programming
Technology
Storyboards
Pricing
Search
Sign in
Sign up for free
GORM v1 → v2に移行したときの変更点/Changes when moving fro...
Search
Sponsored
·
SiteGround - Reliable hosting with speed, security, and support you can count on.
→
株式会社ビットキー / Bitkey Inc.
PRO
December 12, 2024
Technology
360
1
Share
Embed
Copy iframe code
Copy JS code
Copy link
Start on current slide
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
More Decks by 株式会社ビットキー / Bitkey Inc.
See All by 株式会社ビットキー / Bitkey Inc.
Flutter × BLE Centralを自前Pluginで実装する設計パターン - MethodChannel / EventChannelで作る双方向ブリッジの実践 / Building Custom Flutter BLE Central Plugins: Bidirectional Bridging with Method & Event Channels
bitkey
PRO
0
450
Swift&Xcodeのバージョンアップにまつわる怖かった思い出 / Scary Memories of Swift and Xcode Updates
bitkey
PRO
0
230
iOS/Androidの二刀流エンジニアがFlutter & TypeScriptへ越境後の現在地 - Flutterがメインになって見えた景色と現在の醍醐味 / Dual-Platform Mobile Engineer Shifts to Flutter & TypeScript - The View and Real Thrill of Going Flutter-First
bitkey
PRO
0
610
個人開発で育てる「大規模設計の苗床」 - AI時代の1人開発から始める業務への知識接続 / The Seedbed for Large-Scale Design - From AI-Era Solo Projects to Professional Knowledge
bitkey
PRO
1
550
失敗を経て、Harness Engineering で 大切にしたいことを考える / Learning from Failure: What Matters in Harness Engineering
bitkey
PRO
1
630
AI Adaptable なテストを整える工夫 / Ways to Make Your Tests AI-Adaptable
bitkey
PRO
3
320
人が担う「価値」とは?これからの「QA」とは / Human Value and the Future of Quality Assurance
bitkey
PRO
0
360
キャリア25年目にしてTypeScript に出会うまで - 「型」を通じて振り返るプログラミング言語遍歴 / Meeting TypeScript After 25 Years in Tech - Looking Back at My Programming Language Journey Through "Types"
bitkey
PRO
2
520
AIのために、AIを使った、Effect-TSからの脱却 〜テストを活用した安全なリファクタリングの進め方〜
bitkey
PRO
2
1.1k
Other Decks in Technology
See All in Technology
私の推しは「聞いてから進む」AIです -AI-DLCに一人でアプリを作らせた話
yama3133
0
110
Coil3を内部実装から読み解く~キャッシュ戦略とAVIF画像の描画〜/nikkei-tech-talk50
nikkei_engineer_recruiting
0
180
形式手法を使って仕様をコーディングしよう
mikanichinose
0
150
カンファレンスに参加した後の浮遊感とセルフケア
pauli
0
260
Argo CDとAtlantisで実現するインフラ管理のセルフサービス化──小規模SREチームで支えるプラットフォーム
cassius7
0
250
The kernel report
ennael
PRO
1
160
PQC移行の今 -- IETF からみた現在地
satokan
4
700
VS Code × GitHub Copilot での Fabric 開発
ryomaru0825
1
200
Swap and Memory Reclaim - Squeezing Out More RAM
ennael
PRO
1
1.4k
Harness Engineering on Rails
joelq
0
770
雪かき部 #7 もう怖くない!SELECT文!
foursue
0
250
プラットフォームを「作る」、 チームに「入り込む」
sansantech
PRO
0
410
Featured
See All Featured
Max Prin - Stacking Signals: How International SEO Comes Together (And Falls Apart)
techseoconnect
PRO
0
470
The AI Revolution Will Not Be Monopolized: How open-source beats economies of scale, even for LLMs
inesmontani
PRO
3
3.7k
The Illustrated Guide to Node.js - THAT Conference 2024
reverentgeek
1
550
Stop Working from a Prison Cell
hatefulcrawdad
274
21k
RailsConf & Balkan Ruby 2019: The Past, Present, and Future of Rails at GitHub
eileencodes
141
35k
Code Review Best Practice
trishagee
74
20k
How to Get Subject Matter Experts Bought In and Actively Contributing to SEO & PR Initiatives.
livdayseo
0
200
Between Models and Reality
mayunak
4
470
Measuring & Analyzing Core Web Vitals
bluesmoon
9
1k
What the history of the web can teach us about the future of AI
inesmontani
PRO
1
720
Sharpening the Axe: The Primacy of Toolmaking
bcantrill
46
3k
Rebuilding a faster, lazier Slack
samanthasiow
85
9.7k
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