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
25
Featured
See All Featured
Exploring the Power of Turbo Streams & Action Cable | RailsConf2023
kevinliebholz
30
4.6k
How to Think Like a Performance Engineer
csswizardry
22
1.4k
Facilitating Awesome Meetings
lara
52
6.2k
Navigating Team Friction
lara
183
15k
A designer walks into a library…
pauljervisheath
205
24k
A Modern Web Designer's Workflow
chriscoyier
693
190k
Bash Introduction
62gerente
611
210k
Raft: Consensus for Rubyists
vanstee
137
6.8k
Embracing the Ebb and Flow
colly
84
4.6k
The Cult of Friendly URLs
andyhume
78
6.2k
Writing Fast Ruby
sferik
628
61k
Git: the NoSQL Database
bkeepers
PRO
427
65k
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