Upgrade to Pro — share decks privately, control downloads, hide ads and more …

GoのWebアプリ開発での DB関連トラブル

D7bdc8a7ccee78c64ca96e0ed4a7b070?s=47 Go Sagawa
October 28, 2019

GoのWebアプリ開発での DB関連トラブル

D7bdc8a7ccee78c64ca96e0ed4a7b070?s=128

Go Sagawa

October 28, 2019
Tweet

Transcript

  1. GoのWebアプリ開発での DB関連トラブル GoConference 2019 Autumn Oct 28, 2019 Go Sagawa

    and factory,inc. @go_sagawa
  2. About me Go Sagawa Backend engineer and factory, inc. Smartphone

    app Div Twitter : @go_sagawa
  3. 状況と 利用ツール SECTION One

  4. 状況 1.状況と利用ツール • スマホアプリのバックエンドAPI • 開発期間1年 • DBはMySQL5.7 • チームメンバーは2名、Go歴2年未満

  5. 利用しているDB関連のツール 1.状況と利用ツール 名称 レポジトリ 用途 goose bitbucket.org/liamstask/g oose/cmd/goose マイグレーション xo

    github.com/xo/xo DBからgoの構造体生 成 gorm github.com/jinzhu/gorm ORマッパー
  6. gooseとxo SECTION Two

  7. トラブル1 goose マイグレーションが漏れる 2. goose, xo • DB直したら即共有で運用カバーしたが、良い運用パターンを考 えたい

  8. トラブル2 xo 作成された構造体がそのまま使えない 2. goose, xo • RDBに依存した型を利用したくない ◦ Mysql.xxx,sql.xxx等

    ◦ 将来的にRDB以外を利用することも 見据えて • Nullが入るカラムはポインタ型にしたい ◦ Gormで利用するときの兼ね合い • 作成された構造体以外使わない ◦ importもいらない ◦ 不要な関数も多いし、シンプルにするた め
  9. トラブル2 xo 作成された構造体がそのまま使えない 2. goose, xo シェルでごそっと書き換える xoでできたgoの構造体を xoやsqlに依存しないモデル に書き換えるシェル

    https://qiita.com/go_sagawa/items/7dc 5f27ec242cf6c0251
  10. gorm SECTION Three

  11. トラブル3 データ取得が意図通りに動かない 3. gorm • データがないときにnil,nilを返したい ◦ uがmodel.Userでなく&model.User{}だとgormでエラー ◦ データがないときはdb.Errorがnilではなくエラー扱い

  12. トラブル3 データ取得が意図通りに動かない 3. gorm • 毎回NotFoundを調べなくてはいけないが、 そうする以外の手が無さそう…

  13. トラブル4 Updateされるはずなのにされない 3. gorm

  14. トラブル4 Updateされるはずなのにされない 3. gorm • Saveでないとnilや0値は更新されない

  15. トラブル4 Updateされるはずなのにされない 3. gorm UPDATE Structだとnullやゼロ値だと更新しない。 なおMapだと更新される SAVE Structで全カラムnull値やゼロ値含めて更新される

  16. トラブル4 Updateされるはずなのにされない 3. gorm • 基本的に構造体で扱う。 mapは利用しない。 • カラム指定で更新したいケースかつ null値やゼロ値を考慮しなくて良い場合は

    Updateを使う。それ以外 の場合はSaveを使う • 新規データを作成するのには Createを利用し、Saveを利用しない • 新規作成、なければ新規作成、更新の3ケースを明確に分ける。いずれも必ず findを先に実行してチェッ クし、新規で既にデータがある場合、更新のみで更新データがない場合はエラーにする。 • DB構造でも、フラグ等連番管理する場合は問題を避けるため 1始まりにする。実質boolのデータでも 0: 未設定、1:False、2:trueとしたりする。 ◦ Iotaを+1して使うのと同じようなポリシー
  17. トラブル5 明らかにおかしくてもコンパイルが通る 3. gorm • 新たに検索条件を増やそうとした際…

  18. トラブル5 明らかにおかしくてもコンパイルが通る 3. gorm • コンパイルも通るし、エラーにもならない!

  19. トラブル5 明らかにおかしくてもコンパイルが通る 3. gorm • 他にもFindとFirst間違えたり、dbを代入していな かったり • パイプさせる書き方ができるので書き方も揺れが ち

    • 関数を指定した流れで読んでいるかというところ で、静的解析で検知できるかも
  20. sql.DB SECTION Four

  21. トラブル6 パフォーマンスがでないが原因がわからない 4. sql.db gorm周りが怪しいけど問題はどこだ!?

  22. トラブル6 パフォーマンスがでないが原因がわからない 4. sql.db 対策:以下は必ず設定する MaxOpenConnections MaxIdleConnections ConnMaxLifetime どうやって設定すればいいかは以下参照 sql.DBのチューニング方法

    https://qiita.com/go_sagawa/items/11929cd0883608a6888d
  23. まとめ SECTION Five

  24. まとめ 5.まとめ • ライブラリの特性を知って使う • gormは便利だが、トラブルも多い • sql.DBのコネクション設定を理解しておく