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
Sponsored
·
Ship Features Fearlessly
Turn features on and off without deploys. Used by thousands of Ruby developers.
→
Fumiya Suzuki
November 13, 2021
Programming
1.4k
0
Share
GormをVersionUpしたお話
GormをVersionUpした際の苦労とご褒美のお話です
Fumiya Suzuki
November 13, 2021
Other Decks in Programming
See All in Programming
CDK Deployのための ”反響定位”
watany
4
780
ドメインイベントでビジネスロジックを解きほぐす #phpcon_odawara
kajitack
3
790
GitHubCopilotCLIをはじめよう.pdf
htkym
0
190
Swift Concurrency Type System
inamiy
0
530
TiDBのアーキテクチャから学ぶ分散システム入門 〜MySQL互換のNewSQLは何を解決するのか〜 / tidb-architecture-study
dznbk
1
180
アーキテクチャモダナイゼーションとは何か
nwiizo
19
5.3k
ローカルで稼働するAI エージェントを超えて / beyond-local-ai-agents
gawa
3
280
SkillがSkillを生む:QA観点出しを自動化した
sontixyou
6
3.4k
Agentic Elixir
whatyouhide
0
300
「話せることがない」を乗り越える 〜日常業務から登壇テーマをつくる思考法〜
shoheimitani
4
820
mruby on C#: From VM Implementation to Game Scripting (RubyKaigi 2026)
hadashia
2
550
属人化しないコード品質の作り方_2026.04.07.pdf
muraaano
0
190
Featured
See All Featured
[SF Ruby Conf 2025] Rails X
palkan
2
960
Design of three-dimensional binary manipulators for pick-and-place task avoiding obstacles (IECON2024)
konakalab
0
410
Getting science done with accelerated Python computing platforms
jacobtomlinson
2
180
How to Create Impact in a Changing Tech Landscape [PerfNow 2023]
tammyeverts
55
3.3k
HDC tutorial
michielstock
2
630
So, you think you're a good person
axbom
PRO
2
2k
What's in a price? How to price your products and services
michaelherold
247
13k
CSS Pre-Processors: Stylus, Less & Sass
bermonpainter
360
30k
コードの90%をAIが書く世界で何が待っているのか / What awaits us in a world where 90% of the code is written by AI
rkaga
61
43k
The Art of Delivering Value - GDevCon NA Keynote
reverentgeek
16
1.9k
Mobile First: as difficult as doing things right
swwweet
225
10k
The B2B funnel & how to create a winning content strategy
katarinadahlin
PRO
1
340
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との付き合い方を考えるきっかけとなる • パフォーマンスは改善されるのでやるととっても気持ちいい