golang製のDBマイグレーションツールgooseをMySQLで使ってみる

Pocket

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

One Thought on “golang製のDBマイグレーションツールgooseをMySQLで使ってみる

  1. Pingback: 【Go】DBマイグレーションツールGooseをちょっと試す | Yohei Blog

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です

このサイトはスパムを低減するために Akismet を使っています。コメントデータの処理方法の詳細はこちらをご覧ください

Post Navigation