golang製(Go言語)のDBマイグレーションツール、gooseを使ってMySQLのマイグレーションをやってみた。
インストール
https://bitbucket.org/liamstask/goose
こちらに書かれている通りにインストール。(もちろんGoは事前にインストールしておく)
$ go get bitbucket.org/liamstask/goose/cmd/goose
helpを見てみる。
$ goose --help goose is a database migration management system for Go projects. Usage: goose [options] <subcommand> [subcommand options] Options: -env="development": which DB environment to use -path="db": folder containing db info -pgschema="": which postgres-schema to migrate (default = none) Commands: up Migrate the DB to the most recent version available down Roll back the version by 1 redo Re-run the latest migration status dump the migration status for the current DB create Create the scaffolding for a new migration dbversion Print the current version of the database
「goose is a database migration management system for Go projects.」
→「gooseはGoプロジェクト向けのデータベースマイグレーション管理システムです。」
なるほど。
DB設定
適当な場所(プロジェクトのルートディレクトリとか)にgoose用のディレクトリ”db”を作って、
DB設定ファイルのサンプルをコピーしてくる。
$ mkdir db $ cd db $ cp $GOPATH/go/src/bitbucket.org/liamstask/goose/db-sample/dbconf.yml .
dbconf.yml
dbconf.yml を編集する。
とりあえずはdevelopment環境のみをこんな感じで。
development: driver: mymysql open: dbname/user/pass
mymysql の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
gooseがデフォルトで使えるDBDriver
今のところ(2014.06.25現在)、
- “postgres” (github.com/lib/pq)
- “mymysql” (github.com/ziutek/mymysql/godrv)
- “sqlite3” (github.com/mattn/go-sqlite3)
の3つのドライバが使えるそうなので、今回はdriverに”mymysql”を指定。
一応上記以外のドライバが使える仕組みもあるらしいが、よく分からん。
(予定があるだけでまだ実装されてないのかな)
マイグレーション作成
マイグレーションスクリプトを作成する。
golangとSQLのどちらかでスクリプト作成できるが、すぐ試せそうなSQLで作ってみる。
$ goose create create_first sql goose: created /path/to/project/db/migrations/20140625151938_create_first.sql
スクリプト編集
goose Up と goose Down に対応するスクリプトをそれぞれ書きます。
-- +goose Up -- SQL in section 'Up' is executed when this migration is applied CREATE TABLE sample ( id int NOT NULL auto_increment COMMENT 'ID', name varchar(128) NOT NULL COMMENT '名前', CONSTRAINT pk_sample PRIMARY KEY (id) ); -- +goose Down -- SQL section 'Down' is executed when this migration is rolled back DROP TABLE sample;
“`
マイグレーション適用
upコマンドで、スクリプトで定義されたマイグレーションを適用します。
$ goose up goose: migrating db environment 'development', current version: 0, target: 20140625151938 OK 20140625151938_create_first.sql
適用状態の確認
statusコマンドで確認できます。
$ goose status goose: status for environment 'development' Applied At Migration ======================================= Wed Jun 25 20:39:22 2014 -- 20140625151938_create_cards.sql
バージョン管理用テーブルを見てみる
goose_db_versionテーブルが自動的に作成されています。
mysql> show tables ; +------------------+ | Tables_in_dbname | +------------------+ | sample | | goose_db_version | +------------------+ 2 rows in set (0.01 sec) mysql> select * from goose_db_version ; +----+----------------+------------+---------------------+ | id | version_id | is_applied | tstamp | +----+----------------+------------+---------------------+ | 1 | 0 | 1 | 2014-06-25 20:36:28 | | 2 | 20140625151938 | 1 | 2014-06-25 20:39:22 | +----+----------------+------------+---------------------+ 2 rows in set (0.00 sec)
バージョン確認
dbversionコマンドでバージョン確認。
$ goose dbversion goose: dbversion 20140625151938
マイグレーションのロールバック
必要であればdownコマンドでロールバックできます。
$ goose down goose: migrating db environment 'development', current version: 20140625151938, target: 0 OK 20140625151938_create_cards.sql $ goose status goose: status for environment 'development' Applied At Migration ======================================= Pending -- 20140625151938_create_cards.sql
まとめ
さくっと使いやすかった。
ちなみに、MySQL用のdriverは最近までメンテナンスされていそうなこっちの方を使いたい。
普通にgolangでMySQL使うときはこっちにしよう。
https://github.com/go-sql-driver/mysql
最近のコメント