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
SQL Firstなsqlc
Search
yushin
October 14, 2025
0
43
SQL Firstなsqlc
Go Night Talks – After Conference 2025/10/14 で発表した資料です。
yushin
October 14, 2025
Tweet
Share
More Decks by yushin
See All by yushin
gopls で知る言語サーバー
yushin
0
330
Featured
See All Featured
Tips & Tricks on How to Get Your First Job In Tech
honzajavorek
0
430
How to Talk to Developers About Accessibility
jct
2
130
10 Git Anti Patterns You Should be Aware of
lemiorhan
PRO
659
61k
The untapped power of vector embeddings
frankvandijk
1
1.6k
Java REST API Framework Comparison - PWX 2021
mraible
34
9.1k
StorybookのUI Testing Handbookを読んだ
zakiyama
31
6.6k
GitHub's CSS Performance
jonrohan
1032
470k
Six Lessons from altMBA
skipperchong
29
4.1k
Measuring Dark Social's Impact On Conversion and Attribution
stephenakadiri
1
120
No one is an island. Learnings from fostering a developers community.
thoeni
21
3.6k
The State of eCommerce SEO: How to Win in Today's Products SERPs - #SEOweek
aleyda
2
9.5k
AI: The stuff that nobody shows you
jnunemaker
PRO
2
240
Transcript
SQL First なsqlc 1
自己紹介 名前:yushin 経歴:golang 約2 年, python, typescript, kotlin, swift, ruby...
余談: 最近購入したcornix というキーボードが非常にカッコよくて、使いや すくて気に入っています 会場に持って来ているので気になっている方はぜひ 2
sqlc とは何か SQL から型安全なコードを生成する sqlc.yaml config ファイル(connection, engine... ) PostgreSQL,
MySQL, SQLite schema.sql database schema query.sql CRUD 等のquery を記載 3
schema Author schema.sql CREATE TABLE authors ( id BIGSERIAL PRIMARY
KEY, name text NOT NULL, bio text, created_at timestamp without time zone DEFAULT clock_timestamp() NOT NULL ); 4
schema Author models.go type Author struct { ID int64 Name
string Bio pgtype.Text CreatedAt time.Time } 内部でpgx/v5 というPostgreSQL driver を使用することができます。 pgtype.Text はNullable を表現しています。 5
query GetAuthor query.sql -- name: GetAuthor :one SELECT * FROM
authors WHERE id = $1 LIMIT 1; query.sql.go const getAuthor = `-- name: GetAuthor :one SELECT id, name, bio, created_at FROM authors WHERE id = $1 LIMIT 1 ` 6
query GetAuthor query.sql.go func (q *Queries) GetAuthor(ctx context.Context, id int64)
(Author, error) { row := q.db.QueryRow(ctx, getAuthor, id) var i Author err := row.Scan( &i.ID, &i.Name, &i.Bio, &i.CreatedAt, ) return i, err } 7
sqlc の特徴・比較 SQL スキーマ・クエリをもとにコードを生成 → go のコードとスキーマが完全一致する → コード生成時、またはコンパイル時にエラーを検知できる vs
GORM → Go の構造体または gorm タグを元にSQL を生成 → スキーマとズレがある場合、実行時にエラーを検知 vs sqlx → db タグを元に構造体へマッピング → SQL と構造体にズレがある場合、実行時にエラーを検知 8
sqlc メリット・デメリット メリット スキーマ・クエリを元に生成することによる型安全性 table 名, カラム名のタイポにも気づくことができる SQL クエリが .sql
ファイルとして分離されるので、SQL が見やすい デメリット 動的なクエリの構築が苦手 共通化やチェーンなどができない マイグレーションやフックなどの便利機能がない 9
ご清聴ありがとうございました 10