Closed8
sqlcを試す(with SQLite3)
SQLite Supportが入ったので、試してみる
sqlcのCLIをインストール
go install github.com/kyleconroy/sqlc/cmd/sqlc@latest
ymlだと読んでくれないのでyamlにする
sqlc.yaml
version: "2"
sql:
- schema: "_sqlc/schema.sql"
queries: "_sqlc/query.sql"
engine: "sqlite"
gen:
go:
package: "query"
out: "db"
スキーマ情報をジェネレート
sqlc generate
スキーマにはアノテーションが必要
JOINしているSQLの場合は、AS
でエイリアスを指定しないとカラムが存在しませんエラーが出るので注意
$ sqlc generate
# package query
_sqlc/query.sql:6:3: column "user_id" does not exist
sqlc x SQLiteだと、set
のような予約後をエスケープしたテーブル定義の場合、エスケープ文字列が入った状態でコードが生成される。これは型エラーになるので、避けざるを得ない。
ほとんどの SQL コードでは、最も安全な方法は、ユーザー定義オブジェクトの名前として英語の単語を使用しないことです。
SQLiteのカラム名自体↑とも書かれているので、予約後は使わない方針でいいかな、、
こんな感じで、期間を指定するクエリを書くと
SELECT
...
WHERE strftime('%Y-%m-%d', user_work_out.date) >= ? -- since
AND strftime('%Y-%m-%d', user_work_out.date) <= ? -- until
Date
とDate_2
というフィールド名になり、少し可読性が悪いのでリポジトリ層とかでラップしてあげるのが良さそう。
とはいえ、sqlcは生成されたコードが読みやすいですし↑のようにSQLに書いたコメントも生成されたコード内にあるので、苦労しなそう
type HogeParams struct {
Date string
Date_2 string
}
sqlc生産性が爆上がりしつつ、軽量で素晴らしいライブラリだと感じた
- 生成されたコードが軽量で読みやすい
- ライブラリに振り回されている感じが全くしない
- 自前で構造体を書かなくて済む
個人開発で作りたいアプリがあり、sqlcを採用することにした。
十分試せたので、クローズする。
ここら辺の辛みはあるわね
このスクラップは2022/08/12にクローズされました