oil refine migrateのやり直し方

FuelPHPでデータベースのスキーマを変更する標準的な手順はoil refine migrateです。

このコマンドは時おり適切に動作しなくなることがあります。たとえば、最新バージョンまで更新が完了していないのに、Already on the latest migration for app:default.のようなメッセージが出力されて何も動作しない、という挙動に遭遇したりします。

migration履歴の記録場所

migrationの設定は、たとえばfuel/app/config/development/migrations.phpに記録されます。

oil refine migrateを実行するとバージョンがこの設定ファイルにも追記されていきますが、何らかのバージョン不整合が発生した際にこのファイルを編集しても解決しません。

実はRDBMSテーブルの変更履歴は、設定ファイルとは別にデータベース上のmigrationテーブルに記録されています。

migrationリカバリの例

migrationテーブルには、FuelPHPが適用したつもりのmigrationクラスがリストされているので、SQLの知識があれば不整合を直す余地があります。

たとえば最新のmigrationを取り消したいケースでは

DELETE FROM migration WHERE migration LIKE '033_add_done_to_examinations';

のようなコマンドでmigrationテーブルの最新の一行を削除することで、ひとつロールバックされた状態になります。

このとき、取り消したmigrationに対応する実テーブルもdown()に相当する操作を実施しておくことが重要です。たとえばこの例の場合では、

ALTER TABLE examinations DROP COLUMN done;

のような操作です。

カラムを削除し忘れた場合、このあとmigrationを再実行した際に、当然already existsのようなエラーに遭遇します。

中馬崇尋
Chuma Takahiro