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.go
、models.go
、query.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