データベースのマイグレーションツールで自分に合ったのを探していて, 割といいのを見つけたので使い方をメモしておく.
自分としては
- SQLで書ける
- 開発言語に依存しない
- 開発環境に依存しない
- テストデータ投入まで規約がある
を備えているのが欲しかった.
gooseは最後の以外は満たしているのでかなりいい感じ.
インストール
ここは定番で.
$ go get bitbucket.org/liamstask/goose/cmd/goose
ただし, Windowsの場合SQLiteを使うせいかビルドエラーになる.
$ go get bitbucket.org/liamstask/goose/cmd/goose # bitbucket.org/liamstask/goose/cmd/goose C:\Go\pkg\tool\windows_amd64\link.exe: running gcc failed: exit status 1 /usr/lib/gcc/x86_64-pc-msys/5.3.0/../../../../x86_64-pc-msys/bin/ld: -lmingwex が見つかりません /usr/lib/gcc/x86_64-pc-msys/5.3.0/../../../../x86_64-pc-msys/bin/ld: -lmingw32 が見つかりません /usr/lib/gcc/x86_64-pc-msys/5.3.0/../../../../x86_64-pc-msys/bin/ld: -lmingwex が見つかりません /usr/lib/gcc/x86_64-pc-msys/5.3.0/../../../../x86_64-pc-msys/bin/ld: -lmingw32 が見つかりません collect2: エラー: ld はステータス 1 で終了しました
ここで書いた時の現象と一緒だし, たぶんそう.
解決するにはTDM GCCを入れてコマンドプロンプトからgo getを実行しなおせばいい.
(MSYS2だと動作しないので注意.たぶんCygwinもじゃないかなぁ)
設定
何がともあれディレクトリを作ります. 名前はdbでないとダメなようで.(-pathオプションで変えられますが)
$ mkdir db
設定ファイルが必要になるが, 面倒なのでサンプルをコピーしてくる.
$ cd db/ $ cp $GOPATH/src/bitbucket.org/liamstask/goose/db-sample/dbconf.yml ./
後は接続先に合わせて変更する.
サンプルはPostgresだったので, ここではMySQLにしておく.
(mymysqlは誤植ではない, 使うgolangのドライバを明示的に指定している)
development: driver: mymysql open: [DB名]/[ユーザ名]/[パスワード]
MySQLにログインして, データベースも作っておきましょう.
> CREATE DATABASE demo;
接続確認のために状態確認する.
$ goose status goose: status for environment 'development' Applied At Migration =======================================
使う
ここまで来るとかなり単純.
というか単純なものが欲しかったんだけど.
テーブルを作る(upする)
マイグレーションファイルを作るには以下のコマンドを使います.
$ goose create [テーブル名] sql
とりあえずUsersテーブルを作ってみる.
$ goose create users sql goose: created C:\msys64\home\twinbird\dropbox\lab\sample\db\migrations\20170623171909_users.sql
出来たファイルを編集.
$ vi db/migrations/20170623171909_users.sql
こんなのが出来てます.シンプルでいいっすね.
-- +goose Up -- SQL in section 'Up' is executed when this migration is applied -- +goose Down -- SQL section 'Down' is executed when this migration is rolled back
それぞれ編集します.
-- +goose Up -- SQL in section 'Up' is executed when this migration is applied CREATE TABLE users( id SERIAL, name varchar(20), email varchar(20) ); -- +goose Down -- SQL section 'Down' is executed when this migration is rolled back DROP TABLE users;
いよいよ, マイグレーションしましょう.
$ goose up goose: migrating db environment 'development', current version: 0, target: 20170623171909 OK 20170623171909_users.sql
うまくいきました.
戻す(downする)
そのままです.
$ goose down goose: migrating db environment 'development', current version: 20170623171909, target: 0 OK 20170623171909_users.sql
バージョンを見る(dbversion)
バージョンはタイムスタンプそのままみたいですね.
$ goose dbversion
goose: dbversion 20170623171909
最新バージョンに上げ直す(redo)
過去のコミットまで戻った時は便利そうです.
$ goose redo goose: migrating db environment 'development', current version: 20170623171909, target: 0 OK 20170623171909_users.sql goose: migrating db environment 'development', current version: 0, target: 20170623171909 OK 20170623171909_users.sql
感想
自分が求めていたものが大体満たされていて非常に良い感じ.
自作しようかと思っていたけど, 作らなくてよかった.
ドキュメント読むとGo Migrationsってのもあるけど, これは使いそうにないなぁ.