PHPで気軽にテーブルスキーマをマイグレーションするツール

# マイグレーション？
マイグレーションは一般的には _移行する_ という意味になります。
WEB開発界隈では一般的にマイグレーションツールというと、
テーブルスキーマの更新などをソースコードレベルで管理運用できるようにするツールのことを指すことが多いです。

Ruby on Railsで開発を行った事がある人などは馴染みが深いかもしれません。

# PHPでは？
大丈夫です、PHPにもちゃんとあります。

symfonyが利用するコンテナ _doctrin_ にはmigration機能が用意されています。
cakePHPだってbundleとしてmigrationツールは用意されています。
今流行りの高速フレームワークphalconにもdevtoolsという開発ツールの中に用意されています。

それぞれ使い方などは異なりますが、ソースコードレベルでテーブルスキーマを管理することが可能です。

# そんな有名なPHPフレームワークで開発なんてしないんですけど何か？
残念なことに、PHPを利用したWEBアプリケーション開発の現場ではオリジナルのフレームワークを利用していたり、そもそもフレームワークを利用していなかったり、先に上げたようなフレームワークを利用していないケースが多く見受けられます。

でも安心しましょう、今日の投稿はそういう開発者向けに幾つかのマイグレーションツールを紹介するために書いています。

## phpmig
https://github.com/davedevelopment/phpmig

phpmigはマイグレーションのコードに独自のDSLを挟まない（ほぼ生のSQLを書いてコードを管理する）ため、
非常に学習コストが低くて済みます。

ただし、生のSQLが書けるということはSQLを利用するスキーマの操作が何でも可能になるため、
運用にはマイグレーションにどこまでの処理を書けばいいのか？というのはルールとして決めておかないといけません。

最近バージョンが1系にあがりツールとしては安定したレベルまでに成長しているのではないかと思います。

@okinaka **さんからコメントがありましたので補足**
phpmiｇはDBアクセスの抽象ライブラリとして、Doctrin、Zend_Dbを利用することが可能です。
ほぼ生のSQLを書くというのはDBアクセスにPDOを選択した場合で、
Doctrin、Zend_Dbを利用することでORM風の記述でマイグレーションを記述することが可能になります。

### インストール
下記のcomposer.jsonファイルを用意して`composer install`でインストールします。

```json:composer.json
{
  "require": {
    "php": ">=5.3.1",
    "davedevelopment/phpmig": "*",
    "pimple/pimple": "1.*"
  },

  "config": {
    "bin-dir": "bin/"
  }
}
```

### サンプル
```php:phpmig_sample
use Phpmig\Migration\Migration;

class AddColumnHoge_To_Sample extends Migration {
    public function up() {
        $container = $this->getContainer(); 
        $container['db']->query('ALTER TABLE `sample` ADD COLUMN `hoge` INT NOT NULL');
    }

    public function down() {
        $container = $this->getContainer(); 
        $container['db']->query('ALTER TABLE `sample` DROP COLUMN `hoge`');
    }
}
```

## phinx
http://docs.phinx.org/en/latest/

phinxは独自のactive recordのような記述でマイグレーションすることが出来ます。
先に紹介した _phpmig_ と異なり、`up`、`down`、`change`のメソッドを提供し、`down`については必ず`up`での変更を戻す記述をする必要がない...
など学習コストは割りと高めです。

_doctrin_ を使うまではいかない、でも綺麗に書けるマイグレーションツールが欲しいという場合には利用を考えてみるといいかもしれません。
githubを見るとtravisでCIされており安心して利用出来るような気がします。

**ちょっと、はしょって書きすぎたので補足**
phinxでは純粋にSQLを記述してマイグレーションを書く方法も提供されています。
最も、それを利用する必要はあまり考えつきませんが...

### インストール
下記のcomposer.jsonファイルを用意して`composer install`でインストールします。

```json:composer.json
{
  "require": {
    "robmorgan/phinx": "*"
  },
}
```

### サンプル

```php:phinx_sample
use Phinx\Migration\AbstractMigration;

class MyNewMigration extends AbstractMigration {
    public function up() {
        $table = $this->table('sample');
        $table
            ->addColumn('hoge', 'integer')
            ->addColumn('fuga', 'integer', ['limit'=>6])
            ->save();
    }

    public function down() {}
}
```

## LibMugration
http://kohkimakimoto.github.io/lib-migration/

@yjkonyさんからのご紹介

LibMugrationはphpmig同様に実行するSQLを書いてマイグレーションを実行します。
機能としては非常にシンプルです。
ちょっと変わっているなと思ったところは、直接MySQLのcliを実行してマイグレーションを行う事が可能な点でしょうか。
PDOが利用出来ない環境（ドライバにmysqliを利用しているなど）では活躍出来そうです。

## Dbup
http://brtriver.github.io/dbup/ja/

@okinakaさんからのご紹介

DbupはUpコマンドのみを提供します。
マイグレーションを行うファイルはSQL（****.sql）ファイルそのままであり、とにかくシンプルです。
Downコマンドが存在しないため、開発に利用するためのツールというよりはデプロイ時のユーティリティ的な使い方のほうが向いているように思います。

# 最後に...
細かな使い方は一切書きませんでした。
興味が湧き上がってきたなら、ググったり、公式サイト見たり、実際に使ってみるといいかと思います。

マイグレーションツールはバージョン管理ツールと合わせて利用すると本当に高い効果を発揮してくれます。
PHP界隈にももっと普及したらいいのになと願わずにはいれません。

明日は@DQNEOさんです。
よろしくお願いします。