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
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
96
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
Augmenting AI with the Power of Jakarta EE
ivargrimstad
0
590
Herb in Rails 8.2: Your ERB views, now HTML-aware @ Rails World 2026, Austin, Texas
marcoroth
0
200
AI時代のコードレビューは人に向けるな、仕組みに向けろ
texmeijin
5
3.6k
Embedded Swiftで作る自作USBデバイス によるiOSデバイスの自動テスト / iOSDC Japan 2026 glassfiber
glassfiber
0
310
JRuby: Past, Present, and Future
headius
0
230
Turning Architecture into Unit Tests in the AI Era (NSSpain XIV)
steliosf
PRO
1
140
Workers Cache を知る
syumai
0
350
re:Inventに行く前に知っておきたい現地参加のノウハウ
nokomoro3
0
390
Atomic Design, Enforced: Scaling Mobile Design Systems (next.app devCon / droidCon Berlin 2026)
steliosf
PRO
0
160
R8 の設定見直しでアプリサイズ削減
andpad
0
190
phperだってパンチカードでコーディングしたい
o0h
PRO
0
250
iOS 27でニュースアプリはどう変わる!? 〜日経電子版の新機能対応と、開発事例から〜
lynnswap
7
13k
Featured
See All Featured
Optimising Largest Contentful Paint
csswizardry
37
4k
Build your cross-platform service in a week with App Engine
jlugia
234
19k
Abbi's Birthday
coloredviolet
4
10k
JavaScript: Past, Present, and Future - NDC Porto 2020
reverentgeek
52
6.1k
Leo the Paperboy
mayatellez
10
2.4k
What the history of the web can teach us about the future of AI
inesmontani
PRO
2
730
Leveraging LLMs for student feedback in introductory data science courses - posit::conf(2025)
minecr
1
420
Winning Ecommerce Organic Search in an AI Era - #searchnstuff2025
aleyda
2
2.2k
Documentation Writing (for coders)
carmenintech
77
5.6k
JAMstack: Web Apps at Ludicrous Speed - All Things Open 2022
reverentgeek
1
630
Building Experiences: Design Systems, User Experience, and Full Site Editing
marktimemedia
1
620
Lightning talk: Run Django tests with GitHub Actions
sabderemane
0
300
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のコネクション設定を理解しておく