Slide 1

Slide 1 text

GORMのVersionを上げたお話 Go Conference 2021 Autumn Fumiya Suzuki @sntree_suzunoki

Slide 2

Slide 2 text

GORM ● GoのORMで一番スター数が多く、 一番機能が多い ● 直感的にクエリを書くことができて、 初心者でもわかりやすい ● 内部ではreflectを用いて対象の structを認識するので、コード生成を 必要としない ● 2020/08にv2がリリースされた

Slide 3

Slide 3 text

V2 Release Note ● V2はスクラッチで書き直された ● 欲しかった機能がたくさん追加されて いる! ● パフォーマンスも向上したみた い!!!

Slide 4

Slide 4 text

よーしお兄さんパフォーマンスあげちゃうぞ

Slide 5

Slide 5 text

こんなはずじゃなかった...

Slide 6

Slide 6 text

苦労したポイント The Gopher character is based on the Go mascot designed by Renée French .

Slide 7

Slide 7 text

とにかく修正量が多い ● 微妙にクエリが変わるため、GORMを使用している全ての箇所で発行されるクエリ を確認する必要がある ● 引数の型が変更されたり、エラーの判別方法が変更されているのでこれも修正して 回る必要がある ● go-sqlmock等で用意しているモックはほぼ全てに修正が必要になる ● タグのタイポなどでサラッとミスしてエラーが出ないので、単体テストがない場合は 書いていかないと動作を保証しづらい

Slide 8

Slide 8 text

無限のクエリでmapが膨れ上がる ● Prepareされた結果やコネクションの情報はクエリをkeyにしてGORM内部のmap に保存される ● 二回目以降はそのマップからの情報を利用して、二度目のPrepareをしない Prepare map[string]gorm.Stmt Excute map[string]gorm.Stmt Excute 解析結果

Slide 9

Slide 9 text

無限のクエリでmapが膨れ上がる ● このmapは上限もなくevictionされることがないため、fmt.Sprintfなどで動的にクエ リを構築などをしているとマップが膨れ上がる ● また、DBのキャッシュできるStatementの最大数に達してしまい、新たにPrepareで きなくなる ● 動的に構築している部分を書き直していき、複雑すぎるところはそこだけ PrepareStatementModeを利用しないようにした Prepare map[string]gorm.Stmt Excute 解析結果 解析結果 解析結果 解析結果 ・ ・ ・ ・ ・ ・

Slide 10

Slide 10 text

既存の実装に悩まされる ● 自由、便利、なんとなく動く ○ 同じクエリに対して何通りも書き方があるので、人によって書き方が全然違う ○ 同じモデルを色々なところで使いまわしているため修正の影響範囲が大きすぎる ○ Selectを指定していないのでいらない項目を大量に取っていた ○ タグをタイポしていてもcolumnの順番で奇跡的に取れていた The Gopher character is based on the Go mascot designed by Renée French . これ全部同じことやっているのかぁ

Slide 11

Slide 11 text

ご褒美 The Gopher character is based on the Go mascot designed by Renée French .

Slide 12

Slide 12 text

ご褒美 35% 取得遅延が 35%削減されました

Slide 13

Slide 13 text

ご褒美 ● ちょっと安心安全 ○ 全件削除されなくなった ○ 実行時エラーが少なくなった ○ 変な使い方がやりづらくなった ● パフォーマンス向上 ○ PreparedStatementのサポート ○ allocationが少なくなっている ● 欲しかった機能が追加された ○ contextのサポート ○ バッチインサート ○ 複数データベースや ReadWriteの分離の公式サポート ● 今ここでLTしている

Slide 14

Slide 14 text

まとめ ● GORMのV2の内容はとても良いので、バージョンはあげるべき ● しかし、時間がかかると想定しておくと吉 ● GORMとの付き合い方を考えるきっかけとなる ● パフォーマンスは改善されるのでやるととっても気持ちいい