1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

はじめての記事投稿
Qiita Engineer Festa20242024年7月17日まで開催中!

データベースの中身を修正したら詰まった話【CakePHP】

Posted at

皆さんはCakePHPでデータベースのカラムなどを追加したり、削除しようとして、原因不明なエラーが出たことはありませんか?

Formヘルパーとマイグレーションファイルを使ってデータベースを更新していたら遭遇した問題を、備忘録として書き記しておこうと思います。

動作環境
CakePHP 3.10
PHP 8.3.4

先に結論

急いでいる方向けに、先に何をしたか書きます。

bin/cake migrations migrateをする前に

bin/cake cache clear_all

で、CakePHPのキャッシュ削除をする

原因

中身更新前のマイグレーションファイルの内容がキャッシュに残っており、それを参照してCakePHPがデータベースにsave()しようとしていたようです。

起こるまでの経緯

↓↓↓興味がある方は、どうぞ↓↓↓

出てくる関数名などはフィクションです。

第一話 初動

最初の仕様でデータベースとテーブルを作成し、bin/cake bake migration Hogeでマイグレーションファイルを作り、bin/cake migrations migrateで正しく中身を更新、値も入力ページやseedファイルから保存できました。

第二話 変更

その後、保存する値が増えたり減ったりと、仕様が変わりました。
その仕様に伴い、上で作成済のマイグレーションファイルの中身を変更し、再度bin/cake migrations migrateをし、データベースの内容更新が問題なく終わりました。seedファイルでの初期値保存も、上手く行きました。

第三話 異変

よし!次は入力ページから新しく内容を保存しよう!
すると

SQLSTATE[42S22]: Column not found: 1054 Unknown column 'hoge' in 'field list'

消したはずのカラムが見当たらないとエラーメッセージ。
エラーメッセージをコピペして検索して出てきた内容を試しても、どれも意味がなく…。

そりゃ検索して出てきた内容はどれも「カラム名や関数名合ってる?」といった内容なので、「無いはずの物を見当たらない!」と言われている場合の対処法ではなかったので、当たり前。

マイグレーションファイルで値の内容は更新できる様子だったので、仕方なくもう一度hogeというカラムを追加し、初期値をnullにして値を更新させず、放置していました。

第四話 錯綜

不必要なカラムは、nullにして放置すれば最悪なんとかなりました。
問題は、新たに追加したカラムが保存されないことです。
追加したカラムに入力ページから値を保存させようとすると、

SQLSTATE[HY000]: General error: 1364 Field 'fuga' doesn't have a default value

というエラーメッセージが。
デフォルトの値が無いと書かれています。

確かに、fuganullを許容せず、デフォルトもnullでした。このエラーメッセージが出るのも頷けます。
問題は、入れた値が入らない点です。
実験的にデフォルト値を設定すると、何度入力ページから保存しても、そのデフォルト値が入ってきています。

第五話 整理

現状を整理してみようと思います。

  1. 消したはずのカラムが保存されようとしている
  2. データベース内を確認しても、消したカラムは見当たらない
  3. 新たに追加したカラムがきちんと保存されない
  4. seedファイル経由では、新たなカラムも正しく保存されている

つまり、データベースには問題はないが、CakePHPから保存しようとした値が、正しく保存されないということです。

第六話 解明

CakePHPだけがおかしいなら、CakePHPを元に戻せばいいわけです。
そう、つまりはキャッシュの削除です。

bin/cake migrations rollback
bin/cake cache clear_all
bin/cake migrations migrate

マイグレーションファイルを落とし、キャッシュ削除してから再度実行した結果、上手くいきました。
思わぬところで一日使ってしまいました。

最後に

自分自身もまだ社会人なりたてで、色んなところで詰まってQiitaの記事を漁ったり、コードの書き方を忘れて検索することばかりです。
お互い、頑張りましょう。(何様)

同じような状況で詰まっている人の助けになれたのなら、幸いです。

1
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?