LoginSignup
3
1

More than 5 years have passed since last update.

ridgepoleでエラー!`default: nil` is ignored when `null: false`.

Last updated at Posted at 2016-12-22

なんか出た:fearful:

$ bundle exec ridgepole --apply (オプションは省略)を実行。
以下のようなWARNINGメッセージがいくつかズラズラと発生し、Schemafileには差分がないのにchange_columnが走る

[WARNING] Table `tags`: `default: nil` is ignored when `null: false`. Please apply twice
-- change_column("tags", "updated_at", :datetime, {:null=>false, :comment=>"更新日時", :default=>nil})
   -> 0.0104s

原因は…?

create_table "tags", force: :cascade do |t|
  (略)
  t.datetime "updated_at", null: false, comment: '更新日時'
end

カラムにcommentを指定しているのが原因でした。

なぜ?

CREATE TABLE `tags` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `name` varchar(191) NOT NULL,
  `created_at` datetime NOT NULL,
  `updated_at` datetime NOT NULL,
  PRIMARY KEY (`id`),
  UNIQUE KEY `index_tags_on_name` (`name`)
) ENGINE=InnoDB AUTO_INCREMENT=31 DEFAULT CHARSET=utf8mb4;

上記はridepoleで作成したmysqlのテーブル情報。ここにコメント文は反映されていない。
そのため、永遠にカラムに差分が発生し続ける。
すでに存在するカラムにNOT NULL制約を付けようとする場合、defaultが必要となるが、
default値を記述していないためridgepoleがdefault値をnilで埋めようとするので表題のエラーが発生する模様。

解決方法

試しにmysqlで直接カラムにCOMMENTを登録してみたが、ridepoleが取得しているスキーマはCOMMENTを取得しないようなので、Schemafileでcomment文を使うのは諦めてmysqlに直接登録することで解決した。

まとめ

エラー文の内容的にはdefaultの設定周辺が原因かと思ってだいぶ時間がかかったが、
rake db:schema:dump で取り出したスキーマと差分をくらべることで解決したので、
comment文にかぎらず、差分がないのに差分があるように振る舞う時はschema.rbを見比べるとあっさり解決しそうです。

3
1
1

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
3
1