はじめに
本記事ではgolang-migrateとsqlboilerを使ってmysqlのtableを自動でmodel化する方法についてまとめます。
dockerの扱い方については解説しません
環境
- go 1.21.5
- golang-migrate v4.16.2
- sqlboiler v4.15.0
最終的なディレクトリ構成
.
├── app
│ └── domain
│ └── models // この中にmodelが生成されています
│ ├── boil_queries.go
│ ├── boil_table_names.go
│ ├── boil_types.go
│ ├── boil_view_names.go
│ ├── mysql_upsert.go
│ ├── schema_migrations.go
│ └── users.go
├── config.toml
├── data
├── database
│ └── migrations
│ ├── 000001_create_user_table.down.sql
│ └── 000001_create_user_table.up.sql
├── db
│ └── my.cnf
├── docker-compose.yml
├── go.mod
├── go.sum
dockerコンテナの立ち上げ
mysqlのコンテナを立ち上げます。
migration
まず、golang-migrateのインストールを行います。
brew install golang-migrate
次に、以下のコマンドをプロジェクトディレクトリで実行します。
migrate create -ext sql -dir database/migrations -seq create_user_table
database/migrations
はmigrationファイルを管理したいディレクトリ名、create_user_table
は生成されるsqlファイルの名称になります。
上記コマンドを実行すると、指定のディレクトリにsqlファイルが2つ生成されます。
upがついているsqlファイルには以下を記述します
CREATE TABLE `users` (
`id` bigint(20) UNSIGNED NOT NULL AUTO_INCREMENT PRIMARY KEY,
`username` varchar(255) NOT NULL,
`password` varchar(255) NULL DEFAULT NULL
);
downがついているファイルには以下を記述します。
DROP TABLE IF EXISTS users;
以上の操作を行った後、
migrate --path ./database/migrations --database 'mysqlのアドレス' -verbose up
を実行するとusersテーブルが作成されます。
migrate --path ./database/migrations --database 'mysqlのアドレス' -verbose down
を実行するとusersテーブルが削除されます。
他のテーブルを追加したい際も同様の手順でmigrateする事ができます。
以上がmigrateの手順です。
modelの生成
続いて、migrateしたtable情報を元にmodelをsqlboilerで自動生成します。
sqlboilerのインストール
go install github.com/volatiletech/sqlboiler/v4@latest
まず、プロジェクトファイル直下にdb設定を記述したtomlファイルを用意します。
あくまで例なので環境に応じて変更してください
[mysql]
dbname = "golang_test"
user = "test"
pass = "test"
host = "test"
port = 3307
sslmode = "false"
その後、以下のコマンドを実行します。
-o
optionには生成するディレクトリを指定します。
sqlboiler mysql -c config.toml -o app/domain/models --no-tests
すると、指定ディレクトリにmodelが自動で生成されます。
しかし、このままだとpackage errorが出ているかと思うので
go mod init 'プロジェクトディレクトリ名'
go mod tidy
を実行します。
これでエラーが解消されます。
以上でmodelの自動生成が完了です。
終わりに
今回はmodelを自動生成する方法についてまとめてみました。
sqlboilerはgormと比べて、migrate機能がないため、他のツールと併用する必要がありますが、modelに優秀なメソッドが生えるのに加えてこちらのベンチマーク結果にあるように、あらゆる面でパフォーマンスで優れていそうです。
まだまだ使いこなせていないので、使い方について模索していこうと思います。