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
GoのWebアプリ開発での DB関連トラブル
Search
Go Sagawa
October 28, 2019
Programming
77
0
Share
Embed
Copy iframe code
Copy JS code
Copy link
Start on current slide
GoのWebアプリ開発での DB関連トラブル
Go Sagawa
October 28, 2019
More Decks by Go Sagawa
See All by Go Sagawa
gRPCとgrpc-gatewayを フル活用したweb開発
gosagawa
0
83
Errors Handling Talks at GopherCon2019
gosagawa
1
560
バッチとゴルーチンあるある
gosagawa
0
260
レガシーシステムあるある.pdf
gosagawa
0
380
Goを会社に導入して半年
gosagawa
0
120
20180228自社勉強会_プッシュ送信周りをマスターする
gosagawa
0
850
Other Decks in Programming
See All in Programming
TypeScript+Orvalで実現する型安全かつ堅牢でスケーラブルなマルチチャネル通知基盤 / TSKaigi Night talks ~after conference~
d0riven
0
350
TSKaigi Night Talks 2026_TypeScriptでサプライチェーンの整合性を型に閉じ込める
geekplus_tech
0
400
JavaDoc 再入門
nagise
1
370
その問い、本当に正しいですか?AI時代のエンジニアに必要な哲学と認知科学 / ai-philosophy-cognitive-science
minodriven
11
5.8k
A2UI という光を覗いてみる
satohjohn
1
140
AI 時代のソフトウェア設計の学び方
masuda220
PRO
29
13k
Dataformのリポジトリを立ち上げるときにまずやること / dataform-day0-2026
snhryt
0
170
コンテキストの使い捨てをやめる — ビジネスルール駆動開発と miko —
ioki
0
210
Oxcを導入して開発体験が向上した話
yug1224
4
320
さぁV100、メモリをお食べ・・・
nilpe
0
140
Vue × Nuxt × Oxc どこまで使える?実運用の現在地
andpad
0
270
「AIで開発し、AIを届ける」をEvalでつなぐ 〜AIネイティブに始めるプロダクト開発の実践〜 / Connecting "Develop with AI, deliver AI" with Eval
rkaga
4
5.3k
Featured
See All Featured
[SF Ruby Conf 2025] Rails X
palkan
2
1.1k
Reflections from 52 weeks, 52 projects
jeffersonlam
356
21k
No one is an island. Learnings from fostering a developers community.
thoeni
21
3.8k
The Curse of the Amulet
leimatthew05
1
13k
SEO for Brand Visibility & Recognition
aleyda
0
4.6k
GraphQLとの向き合い方2022年版
quramy
50
15k
Lightning talk: Run Django tests with GitHub Actions
sabderemane
0
200
Designing Dashboards & Data Visualisations in Web Apps
destraynor
231
55k
JAMstack: Web Apps at Ludicrous Speed - All Things Open 2022
reverentgeek
1
480
Bioeconomy Workshop: Dr. Julius Ecuru, Opportunities for a Bioeconomy in West Africa
akademiya2063
PRO
1
150
The B2B funnel & how to create a winning content strategy
katarinadahlin
PRO
1
390
YesSQL, Process and Tooling at Scale
rocio
174
15k
Transcript
GoのWebアプリ開発での DB関連トラブル GoConference 2019 Autumn Oct 28, 2019 Go Sagawa
and factory,inc. @go_sagawa
About me Go Sagawa Backend engineer and factory, inc. Smartphone
app Div Twitter : @go_sagawa
状況と 利用ツール SECTION One
状況 1.状況と利用ツール • スマホアプリのバックエンドAPI • 開発期間1年 • DBはMySQL5.7 • チームメンバーは2名、Go歴2年未満
利用しているDB関連のツール 1.状況と利用ツール 名称 レポジトリ 用途 goose bitbucket.org/liamstask/g oose/cmd/goose マイグレーション xo
github.com/xo/xo DBからgoの構造体生 成 gorm github.com/jinzhu/gorm ORマッパー
gooseとxo SECTION Two
トラブル1 goose マイグレーションが漏れる 2. goose, xo • DB直したら即共有で運用カバーしたが、良い運用パターンを考 えたい
トラブル2 xo 作成された構造体がそのまま使えない 2. goose, xo • RDBに依存した型を利用したくない ◦ Mysql.xxx,sql.xxx等
◦ 将来的にRDB以外を利用することも 見据えて • Nullが入るカラムはポインタ型にしたい ◦ Gormで利用するときの兼ね合い • 作成された構造体以外使わない ◦ importもいらない ◦ 不要な関数も多いし、シンプルにするた め
トラブル2 xo 作成された構造体がそのまま使えない 2. goose, xo シェルでごそっと書き換える xoでできたgoの構造体を xoやsqlに依存しないモデル に書き換えるシェル
https://qiita.com/go_sagawa/items/7dc 5f27ec242cf6c0251
gorm SECTION Three
トラブル3 データ取得が意図通りに動かない 3. gorm • データがないときにnil,nilを返したい ◦ uがmodel.Userでなく&model.User{}だとgormでエラー ◦ データがないときはdb.Errorがnilではなくエラー扱い
トラブル3 データ取得が意図通りに動かない 3. gorm • 毎回NotFoundを調べなくてはいけないが、 そうする以外の手が無さそう…
トラブル4 Updateされるはずなのにされない 3. gorm
トラブル4 Updateされるはずなのにされない 3. gorm • Saveでないとnilや0値は更新されない
トラブル4 Updateされるはずなのにされない 3. gorm UPDATE Structだとnullやゼロ値だと更新しない。 なおMapだと更新される SAVE Structで全カラムnull値やゼロ値含めて更新される
トラブル4 Updateされるはずなのにされない 3. gorm • 基本的に構造体で扱う。 mapは利用しない。 • カラム指定で更新したいケースかつ null値やゼロ値を考慮しなくて良い場合は
Updateを使う。それ以外 の場合はSaveを使う • 新規データを作成するのには Createを利用し、Saveを利用しない • 新規作成、なければ新規作成、更新の3ケースを明確に分ける。いずれも必ず findを先に実行してチェッ クし、新規で既にデータがある場合、更新のみで更新データがない場合はエラーにする。 • DB構造でも、フラグ等連番管理する場合は問題を避けるため 1始まりにする。実質boolのデータでも 0: 未設定、1:False、2:trueとしたりする。 ◦ Iotaを+1して使うのと同じようなポリシー
トラブル5 明らかにおかしくてもコンパイルが通る 3. gorm • 新たに検索条件を増やそうとした際…
トラブル5 明らかにおかしくてもコンパイルが通る 3. gorm • コンパイルも通るし、エラーにもならない!
トラブル5 明らかにおかしくてもコンパイルが通る 3. gorm • 他にもFindとFirst間違えたり、dbを代入していな かったり • パイプさせる書き方ができるので書き方も揺れが ち
• 関数を指定した流れで読んでいるかというところ で、静的解析で検知できるかも
sql.DB SECTION Four
トラブル6 パフォーマンスがでないが原因がわからない 4. sql.db gorm周りが怪しいけど問題はどこだ!?
トラブル6 パフォーマンスがでないが原因がわからない 4. sql.db 対策:以下は必ず設定する MaxOpenConnections MaxIdleConnections ConnMaxLifetime どうやって設定すればいいかは以下参照 sql.DBのチューニング方法
https://qiita.com/go_sagawa/items/11929cd0883608a6888d
まとめ SECTION Five
まとめ 5.まとめ • ライブラリの特性を知って使う • gormは便利だが、トラブルも多い • sql.DBのコネクション設定を理解しておく