データベースのマイグレーションツールで自分に合ったのを探していて,
割といいのを見つけたので使い方をメモしておく.
自分としては
- SQLで書ける
- 開発言語に依存しない
- 開発環境に依存しない
- テストデータ投入まで規約がある
を備えているのが欲しかった.
gooseは最後の以外は満たしているのでかなりいい感じ.
インストール
ここは定番で.
$ go get bitbucket.org/liamstask/goose/cmd/goose
ただし, Windowsの場合SQLiteを使うせいかビルドエラーになる.
$ go get 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
こんなのが出来てます.シンプルでいいっすね.
それぞれ編集します.
CREATE TABLE users(
id SERIAL,
name varchar(20),
email varchar(20)
);
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ってのもあるけど, これは使いそうにないなぁ.