Edited at

[phpmig]PHPでマイグレーション

More than 5 years have passed since last update.


phpmig

簡単に実行できる、ベンダーやフレームワークへの依存の少ないPHPのマイグレーションツール

(READMEから意訳

ここに書いてあるメモは全部READMEに書いてある

後々確実にお世話になるので今のうちに軽く触れてめもめも


参考


インストールから初期化まで

PEARかcomposerを利用してphpmigをインストール

composerでのインストールがベストらしい


composerでインストール

プロジェクト用にローカライズされたphpmigが利用できるようになる(直訳

$ cd /path/to/project

$ echo <<EOT > composer.json
{
"require": {
"php": ">=5.3.1",
"davedevelopment/phpmig": "*"
},

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

$ wget http://getcomposer.org/composer.phar
$ php composer.phar install


PEARでインストール

PEAR 1.0用のパッケージはないらしい

$ sudo pear channel-discover pear.atstsolutions.co.uk

$ sudo pear install atst/phpmig-alpha


初期化

PEARでインストールした場合はbin/phpmigphpmigに置き換わる

$ cd /path/to/project

$ phpmig init

簡単な動作確認を兼ねてバージョンチェック

$ bin/phpmig --version


簡易チートシート

マイグレーション実行時はup()メソッド、ロールバック時にはdown()メソッドが呼び出される

コマンド実行前後に$ bin/phpmig statusで確認しながらやると感覚が掴みやすいかもしれない


  • マイグレーション用の雛形を生成

./migrationディレクトリに作成される

$ bin/phpmig generate AddRatingToLolCats ./migrations/


  • ステータス確認

down: 未実行

up: 実行済み

$ bin/phpmig status


  • マイグレーション実行

/migrationディレクトリ内のファイルが順次実行される

$ bin/phpmig migration


  • 1つ戻る

$ bin/phpmig rollback


  • 全て戻る

$ bin/phpmig rollback -t 0


  • 指定のMigration IDの完了時点まで戻る

$ bin/phpmig rollback [MigrationID]


  • 指定のMigration IDのみをup or down

$ bin/phpmig [up|down] [MigrationID]


データベースの接続とか

bin/phpmig initで生成されるphpmig.phpの$container['db']にDBアダプターを入れてやるとmigrations/内のクラスでDBが扱えるようになる

他にも、$containerの配列の要素にオブジェクトなりを入れればmigrations/内で使えるようになる

下の例で行くと、migrations/内で$container['db']や$container['app']が使えるようになる

<?php //phpmig.php

$application = new Zend_Application(
APPLICATION_ENV,
$app_ini
);

use \Phpmig\Adapter,
\Phpmig\Pimple\Pimple;

$container = new Pimple();

$container['app'] = $application;
$container['db'] = Zend_Db::factory($adapterName, $params);

$container['phpmig.adapter'] = $container->share(function () {
// replace this with a better Phpmig\Adapter\AdapterInterface
return new Adapter\File\Flat(__DIR__ . DIRECTORY_SEPARATOR . 'migrations/.migrations.log');
});

$container['phpmig.migrations'] = function() {
return glob(__DIR__ . DIRECTORY_SEPARATOR . 'migrations/*.php');
};

return $container;

migrations/内のクラスからphpmig.phpの$containerを呼び出すには、$this->getContainer()を利用する

<?php // ./migrations/20130217150827_AddSomeTableMigration.php

use Phpmig\Migration\Migration;

class AddSomeTableMigration extends Migration
{
/**
* Do the migration
*/
public function up()
{
$container = $this->getContainer();
$container['db']->query('CREATE TABLE IF NOT EXISTS some_table ( id int )');
}

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