GoとpgxでsqlcをUse

注意: pgx/v5はv1.18.0からサポートされています。

pgxは、PostgreSQL用の純粋なGoドライバーおよびツールキットです。lib/pqがメンテナンスモードに入ってから、多くのGophersのデフォルトのPostgreSQLパッケージになっています。

はじめに

pgxを使用するコードの生成を開始するには、sqlc.yaml設定ファイルのsql_packageフィールドを設定します。有効なオプションはpgx/v4またはpgx/v5です。

version: "2"
sql:
  - engine: "postgresql"
    queries: "query.sql"
    schema: "query.sql"
    gen:
      go:
        package: "db"
        sql_package: "pgx/v5"
        out: "db"

既存のsqlcプロジェクトがない場合は、上記の設定ファイルと以下のquery.sqlファイルでディレクトリを作成してください。

CREATE TABLE authors (
  id   BIGSERIAL PRIMARY KEY,
  name text      NOT NULL,
  bio  text
);

-- name: GetAuthor :one
SELECT * FROM authors
WHERE id = $1 LIMIT 1;

-- name: ListAuthors :many
SELECT * FROM authors
ORDER BY name;

-- name: CreateAuthor :one
INSERT INTO authors (
  name, bio
) VALUES (
  $1, $2
)
RETURNING *;

-- name: DeleteAuthor :exec
DELETE FROM authors
WHERE id = $1;

コードを生成すると、pgx互換のデータベースアクセスメソッドが得られます。

sqlc generate

生成されたコードのウォークスルー

生成されたコードは、lib/pqを使用する際に生成されるコードと非常に似ています。ただし、database/sqlを使用する代わりに、コードはpgxタイプを直接使用します。

package main

import (
    "context"
    "fmt"
    "os"

    "github.com/jackc/pgx/v5"

    "example.com/sqlc-tutorial/db"
)

func main() {
    // urlExample := "postgres://username:password@localhost:5432/database_name"
    conn, err := pgx.Connect(context.Background(), os.Getenv("DATABASE_URL"))
    if err != nil {
            fmt.Fprintf(os.Stderr, "Unable to connect to database: %v\n", err)
            os.Exit(1)
    }
    defer conn.Close(context.Background())

    q := db.New(conn)

    author, err := q.GetAuthor(context.Background(), 1)
    if err != nil {
            fmt.Fprintf(os.Stderr, "GetAuthor failed: %v\n", err)
            os.Exit(1)
    }

    fmt.Println(author.Name)
}

原文:https://docs.sqlc.dev/en/latest/guides/using-go-and-pgx.html