PostgreSQL で sqlc を使うときは、最初から `sql_package: pgx/v5` を指定しよう

sqlc+PostgreSQL では COPY Protocol を使って複数行のインサートをする機能が提供されている。

これはめちゃくちゃ便利で,例えば以下のようなクエリがあったとする。

-- name: CreateAuthors :copyfrom
INSERT INTO authors (name, bio) VALUES ($1, $2);

そうすると以下のようなメソッドが生成される。これで、効率よく複数行のインサートが実施できて便利。

type CreateAuthorsParams struct {
	Name string
	Bio  string
}

func (q *Queries) CreateAuthors(ctx context.Context, arg []CreateAuthorsParams) (int64, error) {
	...
}

しかしこれは、pgx/v5 でしかサポートされていない。 :copyfrom を使うには sql_packagepgx/v5 を指定する必要があるのだ。

さてここで、 https://github.com/sqlc-dev/sqlc/blob/main/internal/codegen/golang/postgresql_type.go#L12 を見ると、 pgx/v5 の場合には、pgtype などを積極的に使うようになるため、sql_package を指定していない sqlc.yaml を後から指定すると、めっちゃ生成される型が変わる。 overrides しまくればまぁ元通りにできるのだがめっちゃめんどくさい。

というわけで、最初から sql_package: pgx/v5 を指定しておくのが吉、だと思う。

(:copyfrom 以外にも、pgx/v5 じゃないと使えない機能がチラホラあるっぽい)

Published: 2025-06-26(Thu) 11:48