[CakePHP]phinxlogと現状のDBが合ってない時の最終手段

なんか知らんが、カラムがないって言われる・・・

Error: SQLSTATE[42S22]: Column not found: 1054 Unknown column ‘hogehoge_id’ in ‘where clause’

確かにテーブルにはないんだけど、migrationファイルにはあるっぽい。
でもmigrations statusとかmigrations migrateとかしてもできてくれない。

そもそも、ちゃんとmigrationやSeederを使って生成したデータベースならともかく、長年継ぎ足した秘伝のSQLDumpとかが元になってると色々おかしくなってることが多い。
ちゃんとやるのであれば、

> bin\cake migrations rollback -t タイムスタンプ

とかでやるのがセオリーなのだが、大元が秘伝のタレ状態なのでいつ何がどうなったのかさっぱりわからないのでどうしようもない。

という時の、最終手段・・・

config/Migrationsから、該当のテーブルのmigrationファイルをすべて特定する。(記述方法にもよるけど、bakeの自動生成ならtable名でgrepで検索できます)
migrationファイルの中身をのup/downと実際のテーブルを見比べて適用されていないMigrationファイルを見つける。
phinxlog テーブルの中のから見つけた提要されていないMigrationファイルのレコードを特定する。
Versionが日付部分、migration_nameが後半の名前の部分で、これが一致するものが該当のレコードになりますので、これを削除します。
次のコマンドを実行します。

./bin/cake migrations status
./bin/cake migrations migrate

これでOK。
なおstatusをやらないと、現状のテーブル状態が更新されず、migrateがされずに終わってしまいます。(その場合はphinxlogから該当のレコードをもう一度削除してやり直し)

タイトルとURLをコピーしました