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.toml
の output
で指定したディレクトリに各種ファイルが生成されます。
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