Open4
「sqlc 雑感」 という記事を書くためのメモ
![voluntas](https://res.cloudinary.com/zenn/image/fetch/s--aN6PZU7H--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_70/https://storage.googleapis.com/zenn-user-upload/avatar/dd1588a875.jpeg)
前提
- PostgreSQL を主にする
- SQLite は紹介程度
- TimescaleDB でも使えるよというのも紹介程度
- MySQL はターゲットにしない
- Go を前提にする
- sqlc-gen-ts-d1 は紹介程度
- https://github.com/orisano/sqlc-gen-ts-d1
- pgx/v5 行ける
- マイグレーションツールは go-migrate
- sqldef も紹介したいがまだ使ってない
![voluntas](https://res.cloudinary.com/zenn/image/fetch/s--aN6PZU7H--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_70/https://storage.googleapis.com/zenn-user-upload/avatar/dd1588a875.jpeg)
sqlc とは
-
https://sqlc.dev/
- SQL をコンパイルして Go のコードを生成する
- PostgreSQL 向けは実際に PostgreSQL のパーサーを利用している
- SQL がおかしくないかチェックできる
-
https://sqlc.dev/posts/2023/07/06/working-on-sqlc-full-time/
- フルタイムで sqlc に取り組み始めた
- メンバーは 2 名っぽい
- 1 名は元 ngrok の人、自分は ngrok が sqlc を利用しているのをみて sqlc を知った
- sqlc 自体のライセンスが変更されることはない
- 便利な補助的サービスを追加していくらしい
-
https://github.com/pganalyze/pg_query_go
- 実際の postgreSQL のソース
- これを利用してるのが強い
-
https://play.sqlc.dev/
- playground ブラウザで sqlc が試せる
- バグ報告に本当に便利
-
https://docs.sqlc.dev/en/stable/
- 一通りのことは書いてある
-
https://github.com/marketplace/actions/setup-sqlc
- GitHub Actions 向け
- これ main ブランチが指定できるか試してないので試す
![voluntas](https://res.cloudinary.com/zenn/image/fetch/s--aN6PZU7H--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_70/https://storage.googleapis.com/zenn-user-upload/avatar/dd1588a875.jpeg)
利用方法
- sqlc をインストールする
go install github.com/kyleconroy/sqlc/cmd/sqlc@latest
-
sqlc-dev/sqlc
かも
- SQL を書く
-
sqlc generate
で実行
基本的にはこれだけ。ただし SQL を書くとき以下のように書く。
-- name: ListAccounts :many
SELECT * FROM account;
-
name
は Go から呼び出すときの関数名 -
:many
は戻り値-
:one
や:exec
などがある - https://docs.sqlc.dev/en/stable/reference/query-annotations.html
-
sql.Null* からの脱却
sqlc の emit_pointers_for_null_types を使って sql.Null* 地獄から脱却する
トランザクション
トランザクションは簡単に利用できます。
sqlc 設定ファイル
- sqlc.yaml を用意する
- sqlc.json でも行ける
- 個人的に YAML の方が見やすい
- コメント書けるし
- schema と query はディレクトリにするのがお勧め
![voluntas](https://res.cloudinary.com/zenn/image/fetch/s--aN6PZU7H--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_70/https://storage.googleapis.com/zenn-user-upload/avatar/dd1588a875.jpeg)
sqlc 文法
@display_name
という感じで変数が指定可能です。
-- name: CreateAccount :exec
INSERT INTO account (
display_name
) VALUES (
@display_name
);
動的に値を変えられます。
if err := s.query.CreateAccount(c.Request().Context(), displayName); err != nil {
zlog.Error().Err(err).Send()
return echo.NewHTTPError(http.StatusInternalServerError)
}