なんか出た
$ 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を見比べるとあっさり解決しそうです。