LoginSignup
50
48

More than 5 years have passed since last update.

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

Last updated at Posted at 2013-02-13

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');
    }
}
50
48
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
50
48