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
GoのWebアプリ開発での DB関連トラブル
Search
Sponsored
·
Ship Features Fearlessly
Turn features on and off without deploys. Used by thousands of Ruby developers.
→
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
93
Errors Handling Talks at GopherCon2019
gosagawa
1
570
バッチとゴルーチンあるある
gosagawa
0
260
レガシーシステムあるある.pdf
gosagawa
0
380
Goを会社に導入して半年
gosagawa
0
130
20180228自社勉強会_プッシュ送信周りをマスターする
gosagawa
0
870
Other Decks in Programming
See All in Programming
フロントエンドUIフレームワークのこれまでとこれから
ssssota
5
2.1k
Deep dive into the select statement (GopherCon UK)
jespino
0
170
Claude Codeを組織的に動かして月400PRを実現した話
happy_ryo
0
270
Building an Out-of-Order CPU
latte72
1
750
スマート反転とウェブアクセシビリティ
camiha
0
180
標準パッケージに uuid が追加された 背景から見る Go らしい意思決定 / go_127_uuid_decision
convto
5
5.7k
個人開発基盤をまるごとCloudflareに引っ越して爆速で総合的体験を向上させた話
tinykitten
0
140
Foundry Localでエージェント開発
seosoft
0
160
【DroidKaigi 2026】「アクセシビリティを利用するとき、 アクセシビリティもまたこちらを利用している」 〜マルウェアによる攻撃と防衛について〜
halunoyo
0
440
Can LLMs Replicate 4 Years of Compose Migration? Exploring the boundaries of automation with 279 XML files from a real product
makun
0
130
kubernetes コンポーネント開発入門 / 新卒N年目の勉強会&交流会!〜〇〇への誘い〜 #n_study
mazrean
0
190
{ Android | Kotlin } Gradle Plugin in 2026
ryunen344
1
300
Featured
See All Featured
So, you think you're a good person
axbom
PRO
2
2.1k
Max Prin - Stacking Signals: How International SEO Comes Together (And Falls Apart)
techseoconnect
PRO
0
460
AI: The stuff that nobody shows you
jnunemaker
PRO
9
980
Principles of Awesome APIs and How to Build Them.
keavy
128
18k
Breaking role norms: Why Content Design is so much more than writing copy - Taylor Woolridge
uxyall
1
400
Color Theory Basics | Prateek | Gurzu
gurzu
0
460
10 Git Anti Patterns You Should be Aware of
lemiorhan
PRO
659
62k
Evolution of real-time – Irina Nazarova, EuRuKo, 2024
irinanazarova
9
1.5k
Collaborative Software Design: How to facilitate domain modelling decisions
baasie
1
320
The Myth of the Modular Monolith - Day 2 Keynote - Rails World 2024
eileencodes
28
3.6k
Designing for humans not robots
tammielis
254
26k
WENDY [Excerpt]
tessaabrams
13
39k
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のコネクション設定を理解しておく