Closed8

sqlcを試す(with SQLite3)

shuntakashuntaka

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
shuntakashuntaka

JOINしているSQLの場合は、ASでエイリアスを指定しないとカラムが存在しませんエラーが出るので注意

$ sqlc generate
# package query
_sqlc/query.sql:6:3: column "user_id" does not exist
shuntakashuntaka

sqlc x SQLiteだと、setのような予約後をエスケープしたテーブル定義の場合、エスケープ文字列が入った状態でコードが生成される。これは型エラーになるので、避けざるを得ない。

https://www.sqlite.org/lang_keywords.html

ほとんどの SQL コードでは、最も安全な方法は、ユーザー定義オブジェクトの名前として英語の単語を使用しないことです。

SQLiteのカラム名自体↑とも書かれているので、予約後は使わない方針でいいかな、、

shuntakashuntaka

こんな感じで、期間を指定するクエリを書くと

SELECT
...
WHERE strftime('%Y-%m-%d', user_work_out.date) >= ? -- since
AND strftime('%Y-%m-%d', user_work_out.date) <= ? -- until

DateDate_2というフィールド名になり、少し可読性が悪いのでリポジトリ層とかでラップしてあげるのが良さそう。
とはいえ、sqlcは生成されたコードが読みやすいですし↑のようにSQLに書いたコメントも生成されたコード内にあるので、苦労しなそう

type HogeParams struct {
	Date   string
	Date_2 string
}
shuntakashuntaka

sqlc生産性が爆上がりしつつ、軽量で素晴らしいライブラリだと感じた

  • 生成されたコードが軽量で読みやすい
    • ライブラリに振り回されている感じが全くしない
  • 自前で構造体を書かなくて済む

個人開発で作りたいアプリがあり、sqlcを採用することにした。
十分試せたので、クローズする。

このスクラップは2022/08/12にクローズされました