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
sqlcを新規サービスに採用してみた!
Search
Kento Nishio
June 16, 2024
2
1.6k
sqlcを新規サービスに採用してみた!
golang.tokyo #35 〜カンファレンス 後夜祭!〜
LT会登壇資料
https://golangtokyo.connpass.com/event/317973/
Kento Nishio
June 16, 2024
Tweet
Share
More Decks by Kento Nishio
See All by Kento Nishio
2023 MRS Fall Meeting & Exhibit
ken2403
0
21
Featured
See All Featured
ピンチをチャンスに:未来をつくるプロダクトロードマップ #pmconf2020
aki_iinuma
111
49k
The Invisible Side of Design
smashingmag
298
50k
Building an army of robots
kneath
302
44k
Embracing the Ebb and Flow
colly
84
4.5k
How STYLIGHT went responsive
nonsquared
95
5.2k
GitHub's CSS Performance
jonrohan
1030
460k
Side Projects
sachag
452
42k
Adopting Sorbet at Scale
ufuk
73
9.1k
Distributed Sagas: A Protocol for Coordinating Microservices
caitiem20
330
21k
Facilitating Awesome Meetings
lara
50
6.1k
YesSQL, Process and Tooling at Scale
rocio
169
14k
The Art of Delivering Value - GDevCon NA Keynote
reverentgeek
8
1.2k
Transcript
© GENDA Inc. sqlcを新規サービスに採用してみた! プロダクト開発部 西尾 健人
© GENDA Inc. 01. 会社説明 02. sqlcとは 03. sqlcを採用した理由 04. プロダクトでsqlcを使う際のTips 目次
© GENDA Inc. 自己紹介 西尾 健人 • GENDA 新卒 •
FE/BE ◦ Go/TypeScript/Dart(Flutter) ◦ Python • 趣味 ◦ 筋トレ、ボディビル
© GENDA Inc. 01. 会社説明
© GENDA Inc. 会社概要 社名 代表取締役社長 設立 上場市場 株式会社GENDA 申
真衣 2018年5月 東京証券取引所グロース市場 資本金 64億6,307万円(資本剰余金含む)2023年8月31日現在 従業員数 連結:11,063名(2024年2月29日時点) 所在地 東京都港区東新橋1-9-1 東京汐留ビルディング17F
© GENDA Inc. 世界中の 人々の人生を より楽しく Aspiration 人が人らしく生きるために「 楽しさ」は不可欠と考え、 私たちは「世界中の人々の人生をより楽しく
」という Aspiration(アスピレーション=大志)を掲げています。
© GENDA Inc. 2つの成長戦略 M&A / Finance GENDAグループはM&Aによって事業領域を拡大しており、 それに伴ってテクノロジーを活用する領域も増えていきます。 GENDAにはプロダクト開発に携わる
プロフェッショナルが集まり、 グループ各社の成長をテクノロジー面でリード しています。 Technology アミューズメント施設会員向け 公式アプリの開発 アミューズメント施設の DX推進 テクノロジーを活用して、 エンターテイメント業界に挑戦 クレーンゲームの オンライン展開 既存事業の成長に加え、 M&Aでの「連続的な非連続な成長」 により 株式価値を高めていくことが成長戦略の柱になっています。
© GENDA Inc. GENDAグループ概観
© GENDA Inc. プロダクト
© GENDA Inc. 02. sqlcとは
© GENDA Inc. sqlcとは SQLのクエリからtype-safeなコード を自動生成するパッケージ https://sqlc.dev/
© GENDA Inc. sqlcのサポート範囲 Language MySQL PostgreSQL SQLite Go Stable
Stable Beta Kotlin Beta Beta Beta Python Beta Beta ー TypeScript Beta Beta ー [1] https://docs.sqlc.dev/en/latest/reference/language-support.html v1.26.0 (2024/06/13) 現在 [1]
© GENDA Inc. sqlcの使い方 01. DBのスキーマと設定ファイル(sqlc.yaml or sqlc.json)を用意 02. SQLのクエリを書く 03. $
sqlc generate 全ての作業は「sqlc playground」[2] で実施しています。 (https://play.sqlc.dev/p/12767f4f5b4a5a6dbda6a51fd6c663cef35515f11bc5df569874a3ab57515b3d) [2] https://play.sqlc.dev
© GENDA Inc. 設定ファイル • queries クエリファイルのパス • schema DDL文のパス
• gen ◦ package 生成されるパッケージ名 ◦ out 生成コードを出力するディレクトリ sqlc.json
© GENDA Inc. クエリを書く DDL文 id指定で購入履歴を一つ取得するクエリ
© GENDA Inc. コード生成 ← クエリがconstで生成 (設定次第) ← データ取得のコードが生成 ←
別ファイルに構造体も生成
03. sqlcを採用した理由
© GENDA Inc. sqlcを採用した理由 01. コードの安定性の向上 02. 生成されるコードの可読性の高さ 03. 個人のOSS → 会社化
© GENDA Inc. コードの安定性の向上 Go標準 ⚪ 使いやすい(クエリ書いて Scanするだけ) ✖ データのマッピング(テーブルのカラムを追加した時とか大変)
高度なORMマッパー(GORM、xorm etc.) ⚪ 型安全 ⚪ Goの書き心地でSQLを扱える △ 学習コスト ✖ データのマッピング
© GENDA Inc. コードの安定性の向上 sqlc ⚪ Go標準の使いやすさ ⚪ 型安全 ⚪
Testもしやすい ⚪ データのマッピング コンパイラがチェックできないエラー( SQL文のマッピング順と引数の順番)を解決 [4] マッピングをSQL文で管理できる (最近はORMでも自動生成できるものがあるらしい: Gorm GEN [5]) [4] https://conroy.org/introducing-sqlc [5] https://gorm.io/gen/index.html
© GENDA Inc. コードの可読性の高さ Goの標準パッケージのみで生成 (context, database/sql, time) データもプリミティブなデータ型で定義さ れる
↓ ORMマッパーに慣れていないメンバー も使いやすい(インターン生が多かった) 最悪手動で直せる
© GENDA Inc. 個人OSS → 会社化 Coreコントリビューターの方が会社を立ち上げて sqlcをフルタイムでサポート&スポンサード • プロダクトレベルで導入する上で少し安心
https://github.com/sqlc-dev/sqlc
© GENDA Inc. 04. プロダクトでsqlcを使 う際のTips
© GENDA Inc. 集計関数を使用する時の注意点( MySQL) ← 集計関数を使用したクエリ ← 集計値の型が interfaceとなってしまう
(具象型は []byte型、詳細はzennへ [6]) [6] https://zenn.dev/genda_jp/articles/b8b8df8e6fc769
© GENDA Inc. 生成されたコードにGodocをつける ↑ コメントを残すと、 生成されたメソッドにGodocも生成される
© GENDA Inc. SQL文のLinterを導入する SQL文が常に正となるのでしっかり保守したい • SQLFluff • ◦ PythonベースのSQL
Linter ◦ 公式のDocker imageもあり扱いやすい [7] [7] https://hub.docker.com/r/sqlfluff/sqlfluff https://sqlfluff.com/
© GENDA Inc. 他にも色々 便利な機能はたくさんある 機能 概要 sqlc verify schemaの変更を検知して、これまでのクエリが問
題ないかを検証してくれる sqlc vet 自分でルールを書いて lintする 特定の操作を禁止したり、実行計画をもとに Slowク エリを特定したりする SQLのmigrationはサポートしていない • up/down migrationをよしなにみてくれる機能はある • 今回はsqldef [8]を使用してスキーマを管理 (sqlcと相性良さそう) [8] https://github.com/sqldef/sqldef
© GENDA Inc. Now Hiring!! エンジニア、募集しています! 他にもプロダクトマネージャーやデータサイエンティスト、 M&A担 当まで幅広く募集しています。
END