はじめに
今回はGo言語の学習で、github版のgooseでのマイグレーションをどうすればいいのか調べてもイマイチいい情報がなかったのでメモ感覚で書きます
使っている環境
- golang 1.23
- これはmacに直接ダウンロードしました。
- docker
- mysql 8.0.34
- goose
やりたい事
マイグレーションファイルを作ってgooseでdocker上にあるmysqlに対してマイグレーションを実行させたい
やったこと
※golangのインストールやdockerでmysqlのコンテナを立ち上げる方法は割愛します(mysqlはmacに直接インストールしても問題ないです)
gooseのインストール
下記コマンドでgooseをインストールする
go install github.com/pressly/goose/v3/cmd/goose@latest
その後whichコマンドで確認する
この時パスが通ってない場合はパスを通す必要あり
which goose
## 何も表示されなかった場合は
echo 'export GOPATH=$HOME/go' >> ~/.zshrc
echo 'export PATH=$PATH:$GOPATH/bin' >> ~/.zshrc
source ~/.zshrc
マイグレーションファイルの作成
まずは「myproject/db/migrations」ディレクトリを作成する(myprojectは自分の好きな名称にしてください)
mkdir -p myproject/db/migrations
その後gooseのコマンドを使ってマイグレーションファイルを作ります(今回はcustomersというテーブルをマイグレーションでつくります)
cd myproject
goose -dir db/migrations create create_customers_table sql
実行が成功するとタイムスタンプ付きの「xxxxxxxxxxxxxxx_create_customers_table.sql」というファイルが「db/migrations」に作成されます
その作成されたファイルを下記のように書き換えます
作成されたファイルに
SELECT 'up SQL query';
SELECT 'down SQL query';
がデフォルトで入っていますが、これ消さないとマイグレーションがうまくいかないので消しましょう!
-- +goose Up
-- +goose StatementBegin
CREATE TABLE `customers` (
`customer_id` INT AUTO_INCREMENT PRIMARY KEY,
`name` VARCHAR(255) NOT NULL,
`password` VARCHAR(255) NOT NULL,
`created_at` TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
`updated_at` TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP
);
-- +goose StatementEnd
-- +goose Down
-- +goose StatementBegin
DROP TABLE IF EXISTS `customers`;
-- +goose StatementEnd
マイグレーションの実行
gooseを使ってマイグレーションを走らせます
コマンド実行は「myproject」で実行するのでカレントディレクトリは「myproject」にしといてください!
今回マイグレーションを走らせたいDB(mysql)の情報は下記のようになります
- ユーザー名: root
- パスワード: root
- ホスト: localhost
- ポート: 3333
- DB名: test_dev
GOOSE_DRIVER=mysql GOOSE_DBSTRING="root:root@tcp(localhost:3333)/test_dev" goose -dir db/migrations up
実行が成功したらDBに「customers」というテーブルが新たに作成されます
マイグレーション実行後切り戻したい場合は下記のコマンドを実行します
GOOSE_DBSTRING="root:root@tcp(localhost:3333)/test_dev" goose -dir db/migrations down
最後に
今回github版のgooseを使ったマイグレーションをしてみました
コマンド実行する際に接続先の指定と使うファイルの指定をどのようにすればいいのかイマイチ分からず苦労しました
ネットだとbibucket版のgooseを使った方法が多数ありますが2015年頃から更新が止まっており個人的にはあまりオススメしません(最新のPCで動かない場合もあるみたいです)
まだGo言語初心者なのでこれから少しずつ学習していきたいです。