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をVersionUpしたお話
Search
Fumiya Suzuki
November 13, 2021
Programming
1.5k
0
Share
Embed
Copy iframe code
Copy JS code
Copy link
Start on current slide
GormをVersionUpしたお話
GormをVersionUpした際の苦労とご褒美のお話です
Fumiya Suzuki
November 13, 2021
Transcript
14 slides
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との付き合い方を考えるきっかけとなる • パフォーマンスは改善されるのでやるととっても気持ちいい
Other Decks in Programming
See All in Programming
Growing PicoRuby's Ecosystem on ESP32
yuuu
2
120
Performance Optimization With LLMs
xleitix
0
250
Augmenting AI with the Power of Jakarta EE
ivargrimstad
0
290
あなたの await、OS まで届いてる? strace で覗く JavaScript の非同期
hasutosasaki
1
2.3k
AmebaブログはKMPから卒業します
kmars0605
0
350
Secure Your Coding Agent Like It’s Malware (v1.5) 🇬🇧 @Code.talks 2026
richargh
0
140
SFCで実現する病院・医療システムの動的組み立て式UI
koukimiura
1
180
Snowflake Openflow Connector利用の勘所 / 20261024developersio2026tokyo-snowflake-openflow
kasacchiful
PRO
0
330
Goコンパイラを作ってGoをもっと理解する / Build a Go compiler to better understand Go
ikura_hamu
0
130
AI Augmentation Techniques with Liberty
ivargrimstad
1
460
AIが実装を担う時代の「技術設計」と「チームマネジメント」
kamina_zzz
2
260
Distance field of Julia set
kinakomoti321
0
320
Featured
See All Featured
For a Future-Friendly Web
brad_frost
184
11k
Rebuilding a faster, lazier Slack
samanthasiow
85
9.8k
How to Think Like a Performance Engineer
csswizardry
28
2.9k
Designing Powerful Visuals for Engaging Learning
tmiket
1
650
We Analyzed 250 Million AI Search Results: Here's What I Found
joshbly
2
2.1k
State of Search Keynote: SEO is Dead Long Live SEO
ryanjones
0
350
The Spectacular Lies of Maps
axbom
PRO
1
1.1k
Lightning talk: Run Django tests with GitHub Actions
sabderemane
0
320
Between Models and Reality
mayunak
4
580
Believing is Seeing
oripsolob
1
280
10 Git Anti Patterns You Should be Aware of
lemiorhan
PRO
659
62k
Let's Do A Bunch of Simple Stuff to Make Websites Faster
chriscoyier
508
140k