LoginSignup
0
0

SQLBoiler事始め

Last updated at Posted at 2023-08-11

GoのORMライブラリSQLBoilerを使った簡単なサンプルを作ってみます。

DBはSQLite3を使用します。

  • Go: v1.18
  • SQLBoiler: v4.14.2

プロジェクトの作成

cd ~/go/src/github.com/TatsuNet
mkdir sql-boiler-sample
cd sql-boiler-sample
go mod init github.com/TatsuNet/sql-boiler-sample

SQLBoilerをまだインストールしていない場合はインストール

go install github.com/volatiletech/sqlboiler/v4@latest
go install github.com/volatiletech/sqlboiler/v4/drivers/sqlboiler-sqlite3@latest
sqlboiler --version
出力
SQLBoiler v4.14.2

データベース、テーブルの作成

sqlite3 sql-boiler-sample.db
CREATE TABLE IF NOT EXISTS users(
  id INTEGER PRIMARY KEY NOT NULL,
  name TEXT NOT NULL
);
.ta
出力
users

テストデータの作成

INSERT INTO users(id, name) VALUES (1, "tatsu");
SELECT * FROM users;
出力
1|tatsu
.exit

SQLBoilerの設定ファイルの作成

プロジェクト直下に以下のファイルを作成

sqlboiler.toml
pkgname="db"
output="db"
no-tests=true

[sqlite3]
  dbname = "./sql-boiler-sample.db"

コード生成

sqlboiler sqlite3

sqlboiler.tomloutput で指定したディレクトリに各種ファイルが生成されます。

ls db
出力
boil_queries.go		boil_table_names.go	boil_types.go		boil_view_names.go	sqlite_upsert.go	users.go

サンプルプログラムの作成

users テーブルから、取得カラム、検索条件を指定してレコードを1件取得するサンプル

main.go
package main

import (
	"context"
	"database/sql"
	"log"

	"github.com/TatsuNet/sql-boiler-sample/db"
	"github.com/cockroachdb/errors"
	_ "github.com/mattn/go-sqlite3"
	"github.com/volatiletech/sqlboiler/v4/queries/qm"
)

const (
	dbFile = "sql-boiler-sample.db"
)

func main() {
	ctx := context.Background()

	db, err := openDB()
	if err != nil {
		log.Fatalf("%+v", err)
	}
	defer db.Close()

	user, err := getUserByID(ctx, db, 1)
	if err != nil {
		log.Fatalf("%+v", err)
	}

	if user == nil {
		log.Fatal("user not found")
	}
	log.Printf("UserId:%d, UserName:%s", user.ID, user.Name)
}

func openDB() (*sql.DB, error) {
	sqlDB, err := sql.Open("sqlite3", dbFile)
	if err != nil {
		return nil, errors.Wrap(err, "failed to open db")
	}
	return sqlDB, nil
}

func getUserByID(ctx context.Context, sqlDB *sql.DB, id int64) (*db.User, error) {
	user, err := db.Users(
		qm.Select(db.UserTableColumns.ID, db.UserColumns.Name),
		db.UserWhere.ID.EQ(id),
	).One(ctx, sqlDB)
	if err != nil {
		switch err {
		case sql.ErrNoRows:
			return nil, nil
		default:
			return nil, errors.Wrap(err, "failed to get record")
		}
	}
	return user, nil
}

実行結果

go mod tidy
go run main.go
出力
2023/08/11 21:31:44 UserId:1, UserName:tatsu
0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0