【Go】DBマイグレーションツールGooseをちょっと試す

golang

GooseっていうGo言語で作られているDBマイグレーションツールがあったので試す。
デベロップ環境とかライブ環境とかで色々変えられるので便利そうなのでMysqlで試してみた。

準備

パッケージ取得

毎度のようにパッケージを取得します。

$ go get bitbucket.org/liamstask/goose/cmd/goose

簡単ですね。

DB準備

DBとユーザを適当に用意してくださいw

試す

dbディレクトリ作成

プロジェクトのルートの下にdbというディレクトリを作りましょう。dbに移動しておきます。

$ mkdir db
$ cd db

設定ファイル取得

サンプルから設定ファイル(yml)をコピーします。

$ cp $GOPATH/src/bitbucket.org/liamstask/goose/db-sample/dbconf.yml .

設定ファイル編集

mysqlに接続するためにはdriverをmymysqlとします。
さらに各環境における設定を書きます。

db/dbconf.yml

development:
    driver: mymysql
    open: dbname/user/password

production:
    driver: mymysql
    open: dbname/user/password

environment_variable_config:
    driver: $DB_DRIVER
    open: $DATABASE_URL

Openの記法

openには次の書き方があります。参考までに。

  • DBNAME/USER/PASSWD
  • unix:SOCKPATH*DBNAME/USER/PASSWD
  • unix:SOCKPATH,OPTIONS*DBNAME/USER/PASSWD
  • tcp:ADDR*DBNAME/USER/PASSWD
  • tcp:ADDR,OPTIONS*DBNAME/USER/PASSWD
  • cloudsql:INSTANCE*DBNAME/USER/PASSWD

接続確認

接続確認でstatusコマンド実行してみます。エラーが出なければ大丈夫です。

$ goose status
goose: status for environment 'development'

マイグレーション作成

マイグレーションファイルはGo or SQLで記述できます。今回は簡単なSQLで。

まず、ファイルを作成します。

$ goose create first sql

db/migration/20140721173517_first.sqlにファイルができます。
このファイルにテーブルのCREATE、DROP文を書きます。

-- +goose Up
-- SQL in section 'Up' is executed when this migration is applied
CREATE TABLE IF NOT EXISTS `push` (
  `id` INT NOT NULL AUTO_INCREMENT,
  `token` VARCHAR(255) NOT NULL COMMENT 'token',
  PRIMARY KEY (`id`))
ENGINE = InnoDB;

-- +goose Down
-- SQL section 'Down' is executed when this migration is rolled back
DROP TABLE `push`;

これで準備はできました。

マイグレーション実行

upコマンドでマイグレーションが1つ進み、テーブルが作成されます。

$ goose up
goose: migrating db environment 'development', current version: 0, target: 20140721173517
OK    20140721173517_first.sql

mysqlで見てみると、次のようなテーブルができていました。

mysql> show tables;
+------------------+
| Tables_in_matom  |
+------------------+
| goose_db_version |
| push             |
+------------------+
mysql> desc goose_db_version;
+------------+---------------------+------+-----+-------------------+----------------+
| Field      | Type                | Null | Key | Default           | Extra          |
+------------+---------------------+------+-----+-------------------+----------------+
| id         | bigint(20) unsigned | NO   | PRI | NULL              | auto_increment |
| version_id | bigint(20)          | NO   |     | NULL              |                |
| is_applied | tinyint(1)          | NO   |     | NULL              |                |
| tstamp     | timestamp           | YES  |     | CURRENT_TIMESTAMP |                |
+------------+---------------------+------+-----+-------------------+----------------+
4 rows in set (0.01 sec)

mysql> select * from goose_db_version;
+----+----------------+------------+---------------------+
| id | version_id     | is_applied | tstamp              |
+----+----------------+------------+---------------------+
|  1 |              0 |          1 | 2014-07-21 17:34:42 |
|  2 | 20140721173517 |          1 | 2014-07-21 17:36:42 |
+----+----------------+------------+---------------------+

マイグレーションバック

1つ戻すにはdownを使います。redoというコマンドでバージョンを1つ戻すことも出来ます。

$ goose down
goose: migrating db environment 'development', current version: 20140721173517, target: 0
OK    20140721173517_first.sql

mysqlでも削除が確認できました。

mysql> show tables;
+------------------+
| Tables_in_matom  |
+------------------+
| goose_db_version |
+------------------+
mysql> select * from goose_db_version;
+----+----------------+------------+---------------------+
| id | version_id     | is_applied | tstamp              |
+----+----------------+------------+---------------------+
|  1 |              0 |          1 | 2014-07-21 17:34:42 |
|  2 | 20140721173517 |          1 | 2014-07-21 17:36:42 |
|  3 | 20140721173517 |          0 | 2014-07-21 17:37:43 |
+----+----------------+------------+---------------------+

チームでどう管理するかとか考えて運用できればなーと思ってます。

参考