-
Notifications
You must be signed in to change notification settings - Fork 132
Fixtureデータ生成時の注意事項
ryuring edited this page Apr 29, 2019
·
1 revision
CakePHPの仕様として、Model::save()
では、DBに定義したデータ型に応じた値の変換を行いますが、Fixture読み込み時に利用されるDbo::insertMulti()では型変換を行いません。
フィールドのデータ型に合わないデータを読み込ませた際の動作がDBごとに異なるため注意が必要です。
テストに利用するFixtureのデータを作成する際には、データ型を厳密に取り扱ってください。
対策例としては次のような事が考えられます。
- integer型のフィールドでは「整数に暗黙的に変換される文字列」ではなく整数を用いる
- null許容のdatetime型のフィールドに空文字列を設定しない
※ミスが多発するようであればBaserFixtureクラスでの自動変換を再度検討します。
空文字列を pagesテーブルのpublish_beginフィールド(datetime型 / null許容 / デフォルトnull)に挿入した場合の各DBの動作は次のようになります。
- MySQL : nullとして格納
- PostgreSQL : レコード挿入時にエラー
- SQLite : 日付型がなくテキスト型で扱われる。空文字列としてそのまま格納
PostgreSQLを利用している場合はエラーにより直接的に不備に気付けますが、SQLiteの場合は公開されている固定ページが取得できなくなるなど間接的な影響しか観測できませんでした。さらにMySQLでは特に問題なく動作してしまうため、かえって原因が究明しづらくなっていました。
この場合は空文字列ではなくnullを指定することで正常に動作します。