sqlboiler
アドベントカレンダー9日目はsqlboiler
について。
sqlboilerはGoにおけるORMです。
GoのORMhはGORMやsqlxなどがありますが、sqlboilerの特徴としてデータベースファーストであることが挙げられます。
インストール
go install github.com/volatiletech/sqlboiler/v4@latest
go install github.com/volatiletech/sqlboiler/v4/drivers/sqlboiler-mysql@latest
sqlboiler設定ファイル
ここで用いている値は先日のアドベントカレンダーGoでsqlを扱うのものに基づいています。
[mysql]
dbname="golang"
host="mysql"
port=3306
user="golang"
pass="golang"
sslmode="false"
モデル生成
sqlboiler mysql
生成されたファイルを見てみます。
root@8f93343dfdb9:/app# ls models
boil_main_test.go boil_suites_test.go boil_view_names.go mysql_upsert.go
boil_queries.go boil_table_names.go mysql_main_test.go users.go
boil_queries_test.go boil_types.go mysql_suites_test.go users_test.go
プログラム本体
package main
import (
"context"
"database/sql"
"fmt"
"log"
"github.com/shuyaeer/learn-go/models"
_ "github.com/go-sql-driver/mysql"
"github.com/volatiletech/sqlboiler/boil"
)
func main() {
// データベースへの接続設定
db, err := sql.Open("mysql", "golang:golang@tcp(mysql:3306)/golang?parseTime=true")
if err != nil {
log.Fatal(err)
}
defer db.Close()
// データベース接続のテスト
if err = db.Ping(); err != nil {
log.Fatal(err)
}
// sqlboiler用の設定
boil.SetDB(db)
// usersテーブルから全ユーザーを取得
users, err := models.Users().All(context.Background(), db)
if err != nil {
log.Fatal(err)
}
// 取得したユーザー情報を表示
for _, user := range users {
fmt.Printf("User: %+v\n", user)
}
}
実行
root@8f93343dfdb9:/app# go run app/day9/main.go
User: &{ID:1 Username:test Password:test Email:{String:test Valid:true} CreatedAt:2023-12-07 14:06:11 +0000 UTC R:<nil> L:{}}
User: &{ID:2 Username:test Password:test Email:{String:test Valid:true} CreatedAt:2023-12-07 14:06:22 +0000 UTC R:<nil> L:{}}
User: &{ID:3 Username:test Password:test Email:{String:test Valid:true} CreatedAt:2023-12-07 14:06:22 +0000 UTC R:<nil> L:{}}
よさそうです。
ORMなだけあって、DBの取り扱いはとても楽ですね。
migrationは別途用意する必要がありますが、既にDBのスキーマが存在する場合等に実力を発揮しそうです。