CakePHP v2.3 を実行しています
プロダクションへのプッシュ中に奇妙なインシデントが発生しました。変更をプルした直後に次のエラーがスローされ、ページをロードできませんでした。列 ( User.group_id
) は、私たちが削除したばかりです。次に、変更されたスキーマに起因するエラーを防ぐことができると考えて、キャッシュ (永続およびモデル) を削除しました。代わりに、キャッシュが再作成されず、次のエラーが生成され、ページを読み込めませんでした...
2013-09-27 07:53:05 Error: [PDOException] SQLSTATE[42S22]: Column not found: 1054 Unknown column 'User.group_id' in 'field list'
Request URL: /admin
Stack Trace:
#0 /home/username/public_html/lib/Cake/Model/Datasource/DboSource.php(459): PDOStatement->execute(Array)
#1 /home/username/public_html/lib/Cake/Model/Datasource/DboSource.php(425): DboSource->_execute('SELECT `User`.`...', Array)
#2 /home/username/public_html/lib/Cake/Model/Datasource/DboSource.php(669): DboSource->execute('SELECT `User`.`...', Array, Array)
#3 /home/username/public_html/lib/Cake/Model/Datasource/DboSource.php(1080): DboSource->fetchAll('SELECT `User`.`...', false)
#4 /home/username/public_html/lib/Cake/Model/Model.php(2674): DboSource->read(Object(User), Array)
#5 /home/username/public_html/lib/Cake/Model/Datasource/DboSource.php(598): Model->find('first', Array)
#6 /home/username/public_html/lib/Cake/Model/Model.php(799): DboSource->query('findById', Array, Object(User))
#7 /home/username/public_html/app/Controller/AppController.php(95): Model->__call('findById', Array)
#8 /home/username/public_html/app/Controller/AppController.php(95): User->findById('12')
#9 /home/username/public_html/lib/Cake/Controller/Component/Auth/ControllerAuthorize.php(64): AppController->isAuthorized('12')
#10 /home/username/public_html/lib/Cake/Controller/Component/AuthComponent.php(409): ControllerAuthorize->authorize('12', Object(CakeRequest))
#11 /home/username/public_html/lib/Cake/Controller/Component/AuthComponent.php(335): AuthComponent->isAuthorized('12')
#12 [internal function]: AuthComponent->startup(Object(PagesController))
#13 /home/username/public_html/lib/Cake/Utility/ObjectCollection.php(131): call_user_func_array(Array, Array)
#14 [internal function]: ObjectCollection->trigger(Object(CakeEvent))
#15 /home/username/public_html/lib/Cake/Event/CakeEventManager.php(247): call_user_func(Array, Object(CakeEvent))
#16 /home/username/public_html/lib/Cake/Controller/Controller.php(670): CakeEventManager->dispatch(Object(CakeEvent))
#17 /home/username/public_html/lib/Cake/Routing/Dispatcher.php(183): Controller->startupProcess()
#18 /home/username/public_html/lib/Cake/Routing/Dispatcher.php(161): Dispatcher->_invoke(Object(PagesController), Object(CakeRequest), Object(CakeResponse))
#19 /home/username/public_html/app/webroot/index.php(97): Dispatcher->dispatch(Object(CakeRequest), Object(CakeResponse))
#20 {main}
いくつかのスクランブリングの後、デバッグ モードを 0 (本番) から 2 (開発) に切り替えたところ、キャッシュが再作成され、ページが適切に読み込まれました。その後、0 に戻しましたが、すべて問題ありませんでした。
したがって、この事件の余波で、2 つの部分からなる質問があります。
なぜこれが起こったのですか?この手順はローカルの開発サーバーでテストしましたが、おそらくずっとデバッグ モード 2 でした。
対応するスキーマの変更を含む CakePHP コードの更新を本番環境にプッシュする正しい方法は何ですか? 最近まで、スキーマの変更のほとんどは追加であったため、新しいコードをプルする前にテーブル/フィールドを本番 DB に手動で追加しても安全でした。ただし、現在のコードで使用されているテーブル/フィールドを削除する「重大な」変更では、これはオプションではありません。