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
85
Errors Handling Talks at GopherCon2019
gosagawa
1
560
バッチとゴルーチンあるある
gosagawa
0
260
レガシーシステムあるある.pdf
gosagawa
0
380
Goを会社に導入して半年
gosagawa
0
120
20180228自社勉強会_プッシュ送信周りをマスターする
gosagawa
0
860
Other Decks in Programming
See All in Programming
プロポーザルを書いてもらう
pvcresin
0
570
改善しないと、タスクが回らない。 “てんこ盛りポジション” を引き継いだ情シスの、入社3ヶ月の業務改善録
krm963
0
280
自動化したのに回らない テスト運用の壁―AI時代の品質責任と生産性
mfunaki
0
400
仕様書を書く前にハーネスを作る - Agent Native開発は「探索を速く、判定を固く」
gotalab555
4
1.7k
まずはプロンプトガイドを読もう、話はそれからだ
kiakiraki
1
190
PyConJP2026_wat_Python × Signal Processing: How to Draw Pictures with Sound Using Spectrogram Art
wat
0
170
Gmail/Google DriveをトリガーにAIエージェントを動かそう! / Run AI agents with Gmail/Google Drive as triggers!
har1101
2
420
関東Kaggler会_NVIDIA_Nemotron_コンペ_振り返り
rick_ds
0
690
in-process GraphQL のすすめ #ginzajs
izumin5210
4
1.4k
そこに3びきプロダクトがいるじゃろう——生成AI時代における“価値が届かない理由”の構造
kosuket
0
560
freeeにおけるEvalsの実践例の紹介
freee
PRO
0
140
人間の目はかわらない、だからJPEGは30年もつ
yuzneri
12
19k
Featured
See All Featured
A Modern Web Designer's Workflow
chriscoyier
698
190k
Odyssey Design
rkendrick25
PRO
2
770
Neural Spatial Audio Processing for Sound Field Analysis and Control
skoyamalab
0
410
SEO for Brand Visibility & Recognition
aleyda
0
4.7k
Hiding What from Whom? A Critical Review of the History of Programming languages for Music
tomoyanonymous
3
1.1k
Conquering PDFs: document understanding beyond plain text
inesmontani
PRO
4
3k
Ecommerce SEO: The Keys for Success Now & Beyond - #SERPConf2024
aleyda
1
2.1k
Stewardship and Sustainability of Urban and Community Forests
pwiseman
0
480
Leveraging Curiosity to Care for An Aging Population
cassininazir
1
470
Information Architects: The Missing Link in Design Systems
soysaucechin
1
1.1k
Faster Mobile Websites
deanohume
310
32k
Context Engineering - Making Every Token Count
addyosmani
9
1.1k
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のコネクション設定を理解しておく