CakePHP RailsのようなMigrationを行う方法

 2010/05/12

CakePHP標準だとRailsのような差分情報を含めたスキーマの管理ができず、不特定多数に配布するアプリケーションでの更新が困難だったり、開発現場でも人によってスキーマが異なってしまったり、といった問題が起こりやすかった。 このような問題を解決するのがCakePHP Migrations Pluginだ。

CakePHP Migrations Pluginは、CakeDCがMITライセンスで配布するオープンソースのCakePHPのプラグインで、これを利用するとRailsのMigrationと同じことが出来る!

詳細については http://cakedc.com/downloads/view/cakephp_migrations_plugin

入手は最新版をgithubから。 http://github.com/CakeDC/Migrations

なお、動作検証はCakePHP1.3で行った。

大まかな流れ

  1. 現在のテーブルのschema.phpを作成 “` cake\console\cake schema generate ”` でスキーマを生成する。
  2. テーブルの変更 “` alter table hogehoge add column hugahuga integer not null default 0; (複数変更可) ”`
  3. migrationコマンドで差分を生成 “` cake migration generate ”`

という順番で作業する

差分ファイルは以下のような形式で出力される(一部抜粋)。

public $migration = array(
    'up' => array(
        'create_field' => array(
            'users' => array(
                'display_name' => array('type' => 'string', 'null' => false, 'length' => 100),
            ),
        ),
        'alter_field' => array(
            'users' => array(
                'email' => array('name' => 'email_address', 'type' => 'string', 'null' => false, 'length' => 200, 'default' => NULL),
            ),
        ),
    ),
    'down' => array(
        'drop_field' => array(
            'users' => array('display_name',),
        ),
        'alter_field' => array(
            'users' => array(
                'email_address' => array('name' => 'email', 'type' => 'string', 'null' => false, 'length' => 200),
            ),
        ),
    ),
);

Migration作成時の注意

Migrationファイルは最新のschema.phpをもとに差分情報を生成しているので、schema.phpが古い状態で複数のMigrationファイルを作成した場合、同時に適用すると同じ変更を複数回実行しようとしてエラーになる。

この場合は作成されたmigrationファイルのうちconflictするものを自分で削除し、map.phpを編集する必要がある。 なお、このmigration機能を利用するためには、modelが作成されていることが(ほぼ)前提となる。 また、僕の環境だと、debugモードが0だとモデルがキャッシュされており、schemaファイルやmigrationファイルに変更が反映されなかったので、debugモードは0以外にして作業を行うことが必要そうだ。

Migrationの実行

マイグレーションを実行するとき

cake\console\cake migration run all

とする。 問題ないようであれば以下のように出力される。

Welcome to CakePHP v1.3.0 Console
---------------------------------------------------------------
App : app
Path: C:\cygwin\home\ryuzee\CakeTest\app
---------------------------------------------------------------
Cake Migration Shell
---------------------------------------------------------------
Running migrations:
  [001] 001
      > Creating table information.
      > Creating table priorities.
      > Creating table projects.
      > Creating table remaining_times.
      > Creating table resolutions.
      > Creating table sprints.
      > Creating table stories.
      > Creating table story_comments.
      > Creating table tasks.
      > Creating table teammembers.
      > Creating table teams.
      > Creating table users.
      > Creating table wiki.

  [002] 002
      > Adding field display_name to users.
      > Changing field email from users.

All migrations have completed.

なお、詳細なマニュアルは http://cakedc.com/eng/downloads/view/cakephp_migrations_plugin を参照のこと。

 2010/05/12

著作

寄稿

Latest post: