CakePHP3のマイグレーション機能でDBから自動で差分取得

はじめに

CakePHP3 にはデータベースのマイグレーション機能があります。これを使えば DB のバージョン管理や共有が簡単にできます。この機能は「Phinx」というツールが利用されていて、bake コマンドを使って実行します。

今日は対象者として、テーブルの追加/削除などは phpMyAdmin や MySQL で行っている人を想定し、CakePHP3 でDBからエクスポートするコマンドと、ファイルから適用するコマンドをご紹介します。

目次
  1. 初回のDB構造エクスポート
  2. 構造の差分をエクスポート
  3. 構造エクスポート時の注意
  4. データをエクスポート
  5. 構造をインポート
  6. データをインポート

1. 初回のDB構造エクスポート

初回時は、下記のコマンドでデータベースの構造すべてを出力します。

$ bin/cake bake migration_snapshot Initial

上記コマンドを実行すると、config/Migrations/20190901123234_Initial.php という感じのファイルが生成されます。

2. DB構造の差分をエクスポート

DBに変更を加えた場合には、下記コマンドで自動的に差分を出力できます。

コマンド最後の「MigrationName」はマイグレーションファイルに付与されるもので、ファイル名は config/Migrations/20190901113452_MigrationName.php のようになります。差分内容に合わせて適切な名称を入れてください。

$ bin/cake bake migration_diff MigrationName

3. 構造エクスポート時の注意

フィールドにtinyint型がある場合、インポート時に、下記のようなエラーになります。

InvalidArgumentException: An invalid column type "tinyinteger" was specified for column "id"

この場合は、下記のように use Phinx\Db\Adapter\MysqlAdapter; を use Migrations\AbstractMigration; の下部に追記し、当該フィールドの 'tinyinteger' を 'integer' に変更。
そして、limit の値を、それぞれ MysqlAdapter::INT_TINY に変更してください。

# use Migrations\AbstractMigration; の下に追加
use Phinx\Db\Adapter\MysqlAdapter;

# tinyint型 のフィールドを修正
->addColumn('id', 'integer', [ # ← tinyinteger から integer に変更
    'default' => null,
    'limit' => MysqlAdapter::INT_TINY, # ← 変更
    'null' => false,
])

4. データのエクスポート

データのエクスポートは、下記コマンドで行います。

例: categories テーブルの場合

$ bin/cake bake seed --data Categories

上記コマンドを実行すると、config/Seeds/CategoriesSeed.php というファイルが生成されます。

2回目以降は、下記のようにファイルを上書きするか尋ねられます。問題がなければ「y」キーを押して上書き保存します。

$ bin/cake bake seed --data Categories

File `/path/to/cake3project/config/Seeds/CategoriesSeed.php` exists
Do you want to overwrite? (y/n/a/q)
[n] >

5. 構造のインポート

下記コマンドで、データベースに構造のインポートができます。

$ bin/cake migrations migrate

6. データのインポート

下記コマンドで、各テーブルのデータをインポートできます。 ただし、対象テーブルにデータが入っている状態で実行するとエラーが出る場合があるので注意が必要です。

$ bin/cake migrations seed