Field ‘ カラム名’ doesn’t have a default value を解消する

あるレコード作成時に、ローカルでは問題ないのにテスト環境では発生したエラー。

ちなみにテスト環境はEC2(Amazon Linux)

以下のコマンドで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に入っていじるのはちょっと怖い。

やっぱりマイグレーションを作った方が良い。ということで、

bundle exec rails g migration AddDefaultカラム名Toテーブル名

でできたマイグレーションに

  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)になっていて、エラーなく機能を実行できた。

根本原因を調べずに対症療法をやっていると、あとになって問題が複雑になってしまう、焦らずにエラーの根本原因を見定めるべし、という教訓を得ました。