脳みそスワップアウト

揮発性なもので。おもにPHPのこととか。

CakePHP3のDBマイグレーション

Phinx を使っている。
これは既存DBから差分を抽出する機能を持っていない。
つまり、マイグレーションの内容は手で書く必要がある。

この点はCake2時代の CakeDC Migration プラグインや、Symfony2に劣っている。

Phinx の記述方法自体はシンプルでわかりやすいので、
単純なスキーマ変更程度ならサクサク書ける。

初回の準備

./bin/cake bake migration_snapshot Initial

config/Migrations/YmdHis_initial.php が生成される。
既存のスキーマが書かれている。

DB上には、マイグレーション用の phinxlog テーブルが作成される。
ファイル名のタイムスタンプ部分がUTCなのが気になるが。
このタイムスタンプ部分がマイグレーションIDとなる。

適用状態確認

./bin/cake migrations status

down が未適用、up が適用済み。

差分のテンプレ作成

初回以降はこれでテンプレを作り、内容を記述していくことになる。

./bin/cake bake migration <migration name>

差分適用

すべてを適用

./bin/cake migrations migrate

migration id を指定して、その時点までの適用ができる

./bin/cake migrations migrate <migration-id>

rollback

最後のマイグレーションを rollback

./bin/cake migrations rollback

migration id を指定してその時点までのrollback実行ができる

./bin/cake migrations rollback <migration-id>

記述方法

up()マイグレーション処理を、down()ロールバック処理を書く。

基本的には初期スキーマファイルと、IDEメソッド補完でなんとかなる。

テンプレで作られる change() は、マイグレーション処理を書く。
up() との違いは、内容を自動的に判別してロールバックするのでこれひとつで済むこと。
・・なのだが、この自動判別には制限があるらしく、ロールバックできない処理も存在する。
(たとえば ALTER TABLE table CHANGE colmn ...)

対応しているかどうかは change() に記述して、マイグレーションロールバックを両方試してみるのが確実。
対応していない処理が書かれていた場合には、ロールバックが失敗してその旨エラーが出る。

そういう場合は up()down() でやることになる。