SQLiteを使い始める

このチュートリアルでは、SQLiteでsqlcを使用する方法の基本を説明します。sqlcの最新バージョンが必要です。生成されたGoコードをビルドして実行する予定の場合は、Goツールチェインも必要です。

セットアップ

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

go mod init tutorial.sqlc.dev/app

設定

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

version: "2"
sql:
  - engine: "sqlite"
    queries: "query.sql"
    schema: "schema.sql"
    gen:
      go:
        package: "tutorial"
        out: "tutorial"

スキーマ

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

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

クエリ

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

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

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

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

-- name: UpdateAuthor :exec
UPDATE authors
set name = ?,
bio = ?
WHERE id = ?;

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

注意: SQLiteの新しいバージョンを使用している場合、UpdateAuthorクエリを以下のように変更することで、更新されたレコードを返すことができます:

-- name: UpdateAuthor :one
UPDATE authors
set name = ?,
bio = ?
WHERE id = ?
RETURNING *;

コード生成

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

sqlc generate

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

使用方法

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

go get modernc.org/sqlite
go build ./...

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

package main

import (
	"context"
	"database/sql"
	_ "embed"
	"log"
	"reflect"

	_ "modernc.org/sqlite"

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

//go:embed schema.sql
var ddl string

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

	db, err := sql.Open("sqlite", ":memory:")
	if err != nil {
		return err
	}

	// テーブルを作成
	if _, err := db.ExecContext(ctx, ddl); err != nil {
		return err
	}

	queries := tutorial.New(db)

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

	// 著者を作成
	insertedAuthor, err := queries.CreateAuthor(ctx, tutorial.CreateAuthorParams{
		Name: "Brian Kernighan",
		Bio:  sql.NullString{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)
	}
}

この例では、デモンストレーションのためにインメモリのSQLiteデータベース(:memory:)を使用しています。実際のアプリケーションでは、通常、永続化データベースに接続するためのファイルパスまたは接続文字列を提供します。


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