PostgreSQLを使い始める

このチュートリアルでは、PostgreSQLでsqlcを使用する方法の基本を説明します。sqlcの最新バージョンとGoツールチェインが必要です。このチュートリアルではGoを使用しますが、他の言語プラグインも利用可能です。

セットアップ

新しいディレクトリを作成し、Goモジュールを初期化します。

go mod init tutorial.sqlc.dev/app

設定

sqlc.yamlファイルを作成し、PostgreSQLエンジンを使用するようsqlcを設定します。

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

スキーマ

schema.sqlでデータベーススキーマを作成します。

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

クエリ

query.sqlで実行したいクエリを作成します。

-- 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: UpdateAuthor :exec
UPDATE authors
  set name = $2,
  bio = $3
WHERE id = $1;

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

コード生成

sqlc generateを実行してコードを生成します。

sqlc generate

tutorialサブディレクトリにdb.gomodels.goquery.sql.goが作成されます。

使用方法

依存関係を取得してプロジェクトをビルドします。

go get github.com/jackc/pgx/v5
go build ./...

生成されたコードは次のように使用できます。

package main

import (
	"context"
	"log"
	"reflect"

	"github.com/jackc/pgx/v5"
	"github.com/jackc/pgx/v5/pgtype"

	"tutorial.sqlc.dev/app/tutorial"
)

func run() error {
	ctx := context.Background()

	conn, err := pgx.Connect(ctx, "user=pqgotest dbname=pqgotest sslmode=verify-full")
	if err != nil {
		return err
	}
	defer conn.Close(ctx)

	queries := tutorial.New(conn)

	// 全著者をリスト
	authors, err := queries.ListAuthors(ctx)
	if err != nil {
		return err
	}
	log.Println(authors)

	// 著者を作成
	insertedAuthor, err := queries.CreateAuthor(ctx, tutorial.CreateAuthorParams{
		Name: "Brian Kernighan",
		Bio:  pgtype.Text{String: "Co-author of The C Programming Language and The Go Programming Language", Valid: true},
	})
	if err != nil {
		return err
	}
	log.Println(insertedAuthor)

	// 作成した著者を取得
	fetchedAuthor, err := queries.GetAuthor(ctx, insertedAuthor.ID)
	if err != nil {
		return err
	}

	// trueを表示
	log.Println(reflect.DeepEqual(insertedAuthor, fetchedAuthor))
	return nil
}

func main() {
	if err := run(); err != nil {
		log.Fatal(err)
	}
}

sqlc Cloud(オプション)

sqlc Cloudを使用してクエリを検証することができます。sqlc CloudダッシュボードでプロジェクトIDを作成します。

sqlc.yamlcloudブロックを追加します:

version: "2"
cloud:
  # sqlc Cloudダッシュボードで取得したプロジェクトIDに置き換える
  project: "<PROJECT_ID>"
sql:
  - engine: "postgresql"
    queries: "query.sql"
    schema: "schema.sql"
    gen:
      go:
        package: "tutorial"
        out: "tutorial"
        sql_package: "pgx/v5"

認証トークンを設定します:

export SQLC_AUTH_TOKEN="<your sqlc auth token>"

クエリをプッシュします:

sqlc push --tag tutorial

後でクエリを検証できます:

sqlc verify --against tutorial

原文:https://docs.sqlc.dev/en/latest/tutorials/getting-started-postgresql.html