CakePHP の実装
- 実際のスキーマを元に、Entity 取得時に実行される SQL の SELECT 句に指定するカラム一覧を生成している
- 上記は schema_cache としてキャッシュされる
- migration ファイルで \Migrations\Table::update を実行時に schema_cache が再考構築される
- これにより、通常は、カラム削除を伴う migration を実行しても問題が起こらない
ハマった事
- BGデプロイメントで、カラム削除を伴う migration をデプロイした際に、ブルー側で、存在しないカラムを SELECT する SQL が実行されエラーになった
- why
- 対策
- 対象 Table クラスのコンストラクタで
$this->getSchema()->removeColumn('対象カラム名')
を実行する事で、schema_cache が古くても、「存在しないカラムの SELECT」を回避できる - migration のデプロイ前に、予め
$this->getSchema()->removeColumn('対象カラム名')
をデプロイしておく事で今回のエラーを回避できる
- 対象 Table クラスのコンストラクタで
// 対象テーブルクラス public function __construct(array $config = []) { parent::__construct($config); // これにより、 `SELECT 削除予定のカラム, ...` が発生しなくなる $this->getSchema()->removeColumn('削除予定のカラム名'); }
ドキュメント
アプリケーションをデプロイする時にプラグインを使用する場合、 テーブルのカラムメタデータを更新するように、必ず ORM キャッシュをクリアしてください。 そうしなければ、それらの新しいカラムの操作を実行する時に、カラムが存在しないエラーになります。