gooseによるテーブルマイグレーション管理

mysql_hosting

複数人でデータベースを使った開発を行っていると、テーブルのスキーマ定義の変更を伝えるのが大変ではないでしょうか?
ALTER文を社内チャットに共有して全員の環境のテーブルを更新したり、Excelで管理したりしても伝え漏れや更新漏れが発生して開発者が使っているデータベースがバラバラになってしまいます。

そこで弊社のプロジェクトではテーブルスキーマをgooseというGo製のDBマイグレーションツールで管理しています。
コードでスキーマが管理できて操作の取り消しなども簡単なので、オススメです。

DBスキーマを変更したい場合は、変更のためのスキーマ定義を作成してgitなどで管理すれば、
他のメンバーは goose コマンドを実行するだけで、最新のスキーマに常にしておくことができます。

gooseのセットアップ

Go及びgooseをインストールします。

  1. goのインストール

https://golang.org/dl/ よりダウンロードしてインストールする。

  1. gooseのインストール
# GOPATH が設定されている前提とします
$ go get bitbucket.org/liamstask/goose/cmd/goose

プロジェクトへの導入方法

インストールすると $GOPATH/bin 配下に goose というコマンドが配置されます。
このコマンドを使って、DBの管理を行います。
PATH環境変数に $GOPATH/bin を追加しておくと便利です。
まず、プロジェクトのルートディレクトリなど適当なところにdbディレクトリを作成し、設定ファイルをコピーします。

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

コピーしたdbconf.ymlのdevelopment環境を設定します。

development:
    driver: mymysql
    open: tcp:localhost:3306*<DB名>/<ユーザー名>/<パスワード>

この状態でdbディレクトリを作ったところでgooseコマンドを実行して失敗しなければ導入完了です。
以下のように空のマイグレーション履歴が出れば導入成功です。

$ goose status
goose: status for environment 'development'
Applied At Migration
=======================================

スキーマ定義の変更方法

テーブルのスキーマの変更や新規テーブルの作成などを行いたい場合は以下の手順でマイグレートファイルを作成します。

  1. dbディレクトリを置いているディレクトリに移動
$ cd /path/to/project/
  1. gooseのマイグレートファイルを作成する。は任意のもの(タイトル的な感じ)
$ goose create sql
goose: created /Users/user/path/to/project/db/migrations/20160823161036_.sql
  1. 2.で作られたマイグレートファイルを編集
-- +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

このようなファイルが作られるので、変更を行うためのクエリをUpのところに、変更を元に戻すクエリをDownのところに記述する。以下例。

-- +goose Up
-- SQL in section 'Up' is executed when this migration is applied
CREATE TABLE `user` (
`name` VARCHAR(16) NOT NULL,
`gender` VARCHAR(16) NOT NULL,
`created_at` TIMESTAMP,
`updated_at` TIMESTAMP,
PRIMARY KEY (`name`)
);

-- +goose Down
-- SQL section 'Down' is executed when this migration is rolled back
DROP TABLE `user`;
  1. 正しくマイグレートできるか確認するためにマイグレーションを行う
$ goose up

マイグレーションの仕方

マイグレーションしたいプロジェクトのソースのホームディレクトリ(dbディレクトリがあるところ)で以下のコマンドを実行すると、最新のスキーマにマイグレートされます。

$ cd /path/to/project/
$ goose up

マイグレートしたものを戻す場合は以下のコマンドで、1つ前の状態に戻ります。

$ cd /path/to/project/
$ goose down