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をVersionUpしたお話
Search
Fumiya Suzuki
November 13, 2021
Programming
0
1.3k
GormをVersionUpしたお話
GormをVersionUpした際の苦労とご褒美のお話です
Fumiya Suzuki
November 13, 2021
Tweet
Share
Other Decks in Programming
See All in Programming
ゲームの物理 剛体編
fadis
0
390
C-Shared Buildで突破するAI Agent バックテストの壁
po3rin
0
430
Rubyで鍛える仕組み化プロヂュース力
muryoimpl
0
260
tsgolintはいかにしてtypescript-goの非公開APIを呼び出しているのか
syumai
7
2.4k
フルサイクルエンジニアリングをAI Agentで全自動化したい 〜構想と現在地〜
kamina_zzz
0
340
AIエージェントの設計で注意するべきポイント6選
har1101
6
2.8k
0→1 フロントエンド開発 Tips🚀 #レバテックMeetup
bengo4com
0
450
Kotlin Multiplatform Meetup - Compose Multiplatform 외부 의존성 아키텍처 설계부터 운영까지
wisemuji
0
150
Python札幌 LT資料
t3tra
7
1.1k
公共交通オープンデータ × モバイルUX 複雑な運行情報を 『直感』に変換する技術
tinykitten
PRO
0
180
Denoのセキュリティに関する仕組みの紹介 (toranoana.deno #23)
uki00a
0
200
Spinner 軸ズレ現象を調べたらレンダリング深淵に飲まれた #レバテックMeetup
bengo4com
1
210
Featured
See All Featured
The Cult of Friendly URLs
andyhume
79
6.7k
Claude Code のすすめ
schroneko
67
210k
Design in an AI World
tapps
0
100
Utilizing Notion as your number one productivity tool
mfonobong
2
190
Skip the Path - Find Your Career Trail
mkilby
0
29
How to Talk to Developers About Accessibility
jct
1
93
What does AI have to do with Human Rights?
axbom
PRO
0
1.9k
Kristin Tynski - Automating Marketing Tasks With AI
techseoconnect
PRO
0
110
Public Speaking Without Barfing On Your Shoes - THAT 2023
reverentgeek
1
280
How to build an LLM SEO readiness audit: a practical framework
nmsamuel
1
590
[Rails World 2023 - Day 1 Closing Keynote] - The Magic of Rails
eileencodes
38
2.7k
Site-Speed That Sticks
csswizardry
13
1k
Transcript
GORMのVersionを上げたお話 Go Conference 2021 Autumn Fumiya Suzuki @sntree_suzunoki
GORM • GoのORMで一番スター数が多く、 一番機能が多い • 直感的にクエリを書くことができて、 初心者でもわかりやすい • 内部ではreflectを用いて対象の structを認識するので、コード生成を
必要としない • 2020/08にv2がリリースされた
V2 Release Note • V2はスクラッチで書き直された • 欲しかった機能がたくさん追加されて いる! • パフォーマンスも向上したみた
い!!!
よーしお兄さんパフォーマンスあげちゃうぞ
こんなはずじゃなかった...
苦労したポイント The Gopher character is based on the Go mascot
designed by Renée French .
とにかく修正量が多い • 微妙にクエリが変わるため、GORMを使用している全ての箇所で発行されるクエリ を確認する必要がある • 引数の型が変更されたり、エラーの判別方法が変更されているのでこれも修正して 回る必要がある • go-sqlmock等で用意しているモックはほぼ全てに修正が必要になる •
タグのタイポなどでサラッとミスしてエラーが出ないので、単体テストがない場合は 書いていかないと動作を保証しづらい
無限のクエリでmapが膨れ上がる • Prepareされた結果やコネクションの情報はクエリをkeyにしてGORM内部のmap に保存される • 二回目以降はそのマップからの情報を利用して、二度目のPrepareをしない Prepare map[string]gorm.Stmt Excute map[string]gorm.Stmt
Excute 解析結果
無限のクエリでmapが膨れ上がる • このmapは上限もなくevictionされることがないため、fmt.Sprintfなどで動的にクエ リを構築などをしているとマップが膨れ上がる • また、DBのキャッシュできるStatementの最大数に達してしまい、新たにPrepareで きなくなる • 動的に構築している部分を書き直していき、複雑すぎるところはそこだけ PrepareStatementModeを利用しないようにした
Prepare map[string]gorm.Stmt Excute 解析結果 解析結果 解析結果 解析結果 ・ ・ ・ ・ ・ ・
既存の実装に悩まされる • 自由、便利、なんとなく動く ◦ 同じクエリに対して何通りも書き方があるので、人によって書き方が全然違う ◦ 同じモデルを色々なところで使いまわしているため修正の影響範囲が大きすぎる ◦ Selectを指定していないのでいらない項目を大量に取っていた ◦
タグをタイポしていてもcolumnの順番で奇跡的に取れていた The Gopher character is based on the Go mascot designed by Renée French . これ全部同じことやっているのかぁ
ご褒美 The Gopher character is based on the Go mascot
designed by Renée French .
ご褒美 35% 取得遅延が 35%削減されました
ご褒美 • ちょっと安心安全 ◦ 全件削除されなくなった ◦ 実行時エラーが少なくなった ◦ 変な使い方がやりづらくなった •
パフォーマンス向上 ◦ PreparedStatementのサポート ◦ allocationが少なくなっている • 欲しかった機能が追加された ◦ contextのサポート ◦ バッチインサート ◦ 複数データベースや ReadWriteの分離の公式サポート • 今ここでLTしている
まとめ • GORMのV2の内容はとても良いので、バージョンはあげるべき • しかし、時間がかかると想定しておくと吉 • GORMとの付き合い方を考えるきっかけとなる • パフォーマンスは改善されるのでやるととっても気持ちいい