マイグレーション

マイグレーションは構造化され整理された方法で、データベースを変更する便利な方法です。SQL の断片を手動で編集することもできますが、他の開発者にもそれを実行するように知らせる責任が生じます。次のデプロイ時に、本番のマシンに対して実行する変更点を記録しておく必要もあります。

データベーステーブル migration が、どのマイグレーションが実行されているかを記録しますので、アプリケーションファイルを更新し、どのマイグレーションが実行されるかを解決するために Migrate::current() を呼び出すだけで済みます。現在のバージョンは、core/config/migration.php の中にありますので、他の設定ファイルと同様に app/config にコピーして変更します。

設定

キー デフォルト 説明
folder string
'migrations/'
マイグレーションファイルが置かれるフォルダ。
connection string
null
マイグレーションを書き込むためのデータベース接続の設定名。
table string
'migration'
マイグレーションデータを格納するためのデータベーステーブル名。
flush_cache boolean
false
If true, all cached data will be erased after all migrations have run, via a call to Cache::delete_all().

Note: マイグレーションが実行された後、設定ファイルはバージョン情報が上書きされます。それらのバージョン番号は内部的に使われるため変更してはいけません。

マイグレーションの作成

app/migrations フォルダにファイルを作成します。プレフィックスは 001 から始まる増加する数字です。数字はスキップせずに、また同じ数字を使わないようにする必要があります。最初のファイルは、app/migrations/001_example.php のようになります。

namespace Fuel\Migrations;

class Example
{

    function up()
    {
        \DBUtil::create_table('posts', array(
			'id' => array('type' => 'int', 'constraint' => 5),
			'title' => array('type' => 'varchar', 'constraint' => 100),
			'body' => array('type' => 'text'),
		), array('id'));
    }

    function down()
    {
       \DBUtil::drop_table('posts');
    }
}

マイグレーションの実行

マイグレーションは、2 つの方法で実行できます:

  1. Migrate クラス
  2. oil refine コマンド

oil コマンドは refine コマンドを使用して、マイグレーション タスク を呼び出します。

$ php oil refine migrate
$ php oil refine migrate:current
$ php oil refine migrate:up
$ php oil refine migrate:down
$ php oil refine migrate --version=10

マイグレーションはモジュールとパッケージもサポートします。oil コマンドで、すべてをマイグレートしたり、特定のモジュールやパッケージのみを指定することができます。 モジュールやパッケージを指定した場合に、アプリケーションのマイグレーションも含めたい場合は、 '--default' を指定します。

$ php oil refine migrate -all
$ php oil refine migrate --modules=module1,module2 --packages=package1
$ php oil refine migrate:up --packages=package1
$ php oil refine migrate:down --modules=module1,module2 --default
$ php oil refine migrate --version=10

Note: migrate:current タスクは、あたかも最新のマイグレーションが安定しているとは言えないアプリケーションのコピーをたった今受け取ったかのように、 fuel/[app|core]/config/migrate.php に記載されているバージョンにあなたのスキーマをマッチさせます。 マイグレーションのために oil を使うと、このマイグレーションの設定番号を修正しますので、多くの状況で current コマンドは必要ありません。

マイグレーションのスキップ

up() または down() メソッドで false を返すことで、マイグレーションプロセスを中断することができます。 これは、マイグレーションが外部に依存している、例えば、別のマイグレーションによって作成されたテーブルがある場合などに 便利です。

これは、現在処理されているマイグレーションスタック、アプリケーションマイグレーションまたは 1つのモジュールやパッケージのマイグレーションのみを中断します。 他のスタックのマイグレーションはすべて通常どおり処理されます。

マイグレーションの準備

必要に応じて、マイグレーションクラスは before() および/または after() メソッドを含むことができ、それは、検証またはクリーンアップ機能の準備に使用することができます。 一般的な機能を持っている場合は、これらのメソッドを含む移行のためのマイグレーションベースクラスを作成することができるため、 すべてのマイグレーションコードを複製する必要はありません。

up() メソッドと同様に、 before()after() メソッドは、失敗を通知するために false を返すことができます。 マイグレーションが一般的な外部依存関係、もしくは追加の検証ステップを持っている場合に役立ちます。 それがない場合には、マイグレーションが省略され、再試行でも障害が発生した場合は最終的に中断されます。 false を返す after() メソッドの場合、マイグレーションはマイグレーションメソッドを逆に呼び出すことによって (すなわち、 up() のマイグレーション時、そして、その逆も同様に down() を呼び出し) 元に戻されます。

マイグレーション自体は成功した場合 after() メソッドのみが呼び出されます。 マイグレーションメソッドが false を返した場合、それは呼び出されません。