rails migrateとrollbackの両方ができなくなってしまった
教訓
- migrationファイルは手動で編集しないこと
- カラムを変更するなど、rollbackが出来ないmigrationファイルを作成しないこと
事象
ステージングでdb:migrate
とdb:rollback
が効かなくなりどうしょうもなくなってしまった。
原因
migrate済みのファイルを二つに分割したあと、rollback不可能なmigrationをしてしまったことが原因となります。
手順1
最初にmigrateファイルを作成し、stagingで実行します。
class AddAAndBToHoge < ActiveRecord::Migration def change add_column :hoges, :a, :string add_column :hoges, :b, :string end end
heroku run rake db:migrate
手順2
ロールバック不可能なmigrateファイルを作成し、stagingで実行します。
class ChangeCFromHoge < ActiveRecord::Migration def change change_column :hoges, :c, :boolean end end
heroku run rake db:migrate
手順3
そのあとでmigrationファイルを2つに分割します。
class AddAAndBToHoge < ActiveRecord::Migration def change add_column :hoges, :a, :string end end
class AddAAndBToHoge < ActiveRecord::Migration def change add_column :hoges, :b, :string end end
手順4
この後でmigrateを実行しようとするとcolumn :b
が既に存在するため、migrate errorとなりました。
対処
手順1
MySQLにログインし、hogesテーブルからカラムbを削除します
ALTER TABLE hoges DROP b;
手順2
DBからschema.rbを生成
heroku run rake db:schema:dump
手順3
migrationを実行します
heroku run rake db:migrate