railsがんばる子

Ruby on Railsがんばる子です。胡蝶蘭のECサイトを運営しています。

rails migrateとrollbackの両方ができなくなってしまった

教訓

  • migrationファイルは手動で編集しないこと
  • カラムを変更するなど、rollbackが出来ないmigrationファイルを作成しないこと

事象

ステージングでdb:migratedb: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