Field ' カラム名' doesn't have a default value を解消する
あるレコード作成時に、ローカルでは問題ないのにテスト環境では発生したエラー。
以下のコマンドでMYSQLの中身を見ていく
show databases;
use データベース名;
describe テーブル名;
該当のカラム(boolean型)のデフォルト値がローカルでは0(false)になっているのに、テスト環境ではNULLになっている。
どちらもNULLがNOなので、テスト環境で「NULLだめって言われてるのに、デフォルトでNULL入れろと言われましても」と言われてる。
このカラムを作った時のマイグレーションを見てみると、
add_column :requests, :spot_flg, :boolean, defalt: false, null: false
defaultがdefaltになっている 笑
ローカル上でうまくいかないがdefaultのスペルミスに気づかず、MYSQLに入ってdefault値を追加したが、テスト環境ではしなかったか、もしくはschema.rbのコンフリクトが起こった時になにか不具合があったのだろう
そこでテスト環境のMYSQLに入って、デフォルトを0(false)にする。
ALTER TABLE テーブル名 ALTER カラム名 SET DEFAULT 0;
これでもいいが、本番環境のMYSQLに入っていじるのはちょっと怖い。
やっぱりマイグレーションを作った方が良い。ということで、
でできたマイグレーションに
def change
change_column :テーブル名, :カラム名, :boolean, default: false, null: false
end
bundle exec rake db:migrate
一度テスト環境の該当のカラムのデフォルト値をNULLにはできないので、1にして、
ALTER TABLE テーブル名 ALTER カラム名 SET DEFAULT 1;
テスト環境にデプロイしたところ、ちゃんと0(false)になっていて、エラーなく機能を実行できた。
根本原因を調べずに対症療法をやっていると、あとになって問題が複雑になってしまう、焦らずにエラーの根本原因を見定めるべし、という教訓を得ました。