アラタナエンジニアブログ

aratana Engineer's Blog

PHPのお手軽データベースマイグレーションツール「phpmig」を使ってみる

開発チームの森藤です。

PHPでも今どきのフレームワークであればデータベースマイグレーションが仕組みとして備わっていますが、
例えばEC-CUBEのようなOSSソフトウェアでは仕組みはありません。
ただ、EC-CUBEはカスタマイズを行う場合がある。こういった場合に後付けでデータベースマイグレーションをしたい場合に、「phpmig」という
ツールがあるので、今回はphpmigを使ってみましょう。
もちろん、EC-CUBEとは何ら依存性は無いので、MySQLだろうがPostgreSQLであろうが使えます。

必要なのはcomposerと事前にデータベースに繋がるような設定が必要です。
今回はCentOS6.4とPostgreSQL9.1を使用します。

今回のcomposer.jsonの中はこんな感じです。

{
    "require": {
        "php": ">=5.3.1",
        "davedevelopment/phpmig": "dev-master",
        "pimple/pimple": "1.*"
    },
    "config": {
        "bin-dir": "bin/"
    }
}

composer.jsonの準備が出来たら、phpmigを入れます。

$ composer update

インストールが出来たら、phpmigの初期設定をします。

$ bin/phpmig init

  1. d ./migrations Place your migration files in here
  2. f ./phpmig.php Create services in here

phpmig initを叩くと、phpmig.phpが生成されますので、PDO経由で操作が出来るように編集します。

<?php

use \Phpmig\Adapter,
\Pimple;

$container = new Pimple();

$container['db'] = $container->share(function() {
$dbh = new PDO('pgsql:dbname=dbname;host=127.0.0.1','user','password');
$dbh->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
return $dbh;
});

$container['phpmig.adapter'] = $container->share(function() use ($container) {
return new Adapter\PDO\Sql($container['db'], 'migrations');
});

$container['phpmig.migrations_path'] = __DIR__ . DIRECTORY_SEPARATOR . 'migrations';

return $container;

※dbname、host、user、passwordは環境によって適宜書き換えてください。

phpmig.phpの編集が終わったら、スケルトンを生成します。

$ /usr/local/bin/php bin/phpmig generate testmigrations ./migrations/

※testmigrationsの部分は適宜書き換えてください。

実行するとファイルがmigrationsディレクトリ以下にファイルが生成されます。

  1. f ./migrations/20150317122030_testmigrations.php

一旦ステータスを確認してみます。

$ /usr/local/bin/php bin/phpmig status

Status Migration ID Migration Name
down 20150317122030 Testmigrations


それでは早速スケルトンを編集してみます。
今回は「dtb_test」というテーブルを作成、削除するように作成してみます。

<?php

use Phpmig\Migration\Migration;

class Testmigrations extends Migration
{
    /**
    * Do the migration
    */
    public function up()
    {
         $container = $this->getContainer();
         $container['db']->query("CREATE TABLE dtb_test (id INTEGER,name TEXT);");
    }

    /**
    * Undo the migration
    */
    public function down()
    {
         $container = $this->getContainer();
         $container['db']->query("DROP TABLE IF EXISTS dtb_test;");
    }
}

それではマイグレーションを実行してテーブルを作成してみます。

$ /usr/local/bin/php bin/phpmig migrate
== 20150317122030 Testmigrations migrating
== 20150317122030 Testmigrations migrated 0.0279s

dtb_testテーブルが作成されました。

f:id:m-r-f-j:20150322130704p:plain


逆に元の状態に戻してみます。

$ /usr/local/bin/php bin/phpmig rollback
== 20150317122030 Testmigrations reverting
== 20150317122030 Testmigrations reverted 0.0104s

dtb_testテーブルが削除されました。

f:id:m-r-f-j:20150322130734p:plain


例えば指定箇所まで進める、戻すは以下のように指定します。

指定箇所まで戻す

$ /usr/local/bin/php bin/phpmig rollback [ Migration ID ]

指定部分のみ反映

$ /usr/local/bin/php bin/phpmig [up / down] [ Migration ID ]

全てを戻す

$ /usr/local/bin/php bin/phpmig rollback -t 0

このように、例えばEC-CUBEのようなデータベースマイグレーションの仕組みを持っていないソフトウェアの場合でも
別のツールを使うことで簡単に導入することが出来ます。

データベースの変更履歴をまだSQLをファイルで管理することで対応している場合は、反映の順番などで問題が起きることがあり、
SQL記述者が詳細にコメントしていないと思わぬトラブルになります。

非常に簡単に導入出来ますので、一度試してみてはいかがでしょうか。