環境
Rails 5.0.3
ruby 2.3.3p222 (2016-11-21 revision 56859) [x86_64-darwin17]
Mysql: Server version: 5.7.21
現象
Railsの開発でたまに起きたことです。ブランチの切り替えるより、すでにmigrationを適用済みで、またmigrationを修正して、適用しようとすると、以下のエラーが起きます。
rake aborted!
StandardError: An error has occurred, all later migrations canceled:
Mysql2::Error: Table 'xxx_jobs' already exists: ...
Mysql2::Error: Table 'xxx_jobs' already exists
...
Tasks: TOP => db:migrate
対策
ロールバックできる
rake db:migration:status
でmigrationのステータスを確認した上でrollbackして、migrationを再実行すれば行けるはずです。
rake db:migration:status
rake db:rollback
...
rake db:migration
ロールバックできない
DBを作り直す
- やる前に、mysqldumpでDBをダンプして保存してください、
- DBを作り直す
rake db:drop; rake db:create; rake db:migrate
- ダンプしたデータをインポートする
rake db:migration:status
注意: もし新しいmigrationで外部キーの追加などが含まれている場合は、ダンプしたデータをそのままインポートすると、migrationが古いほうに戻される可能性があるため、ご注意ください。
その場合は↓の方法でやるしかないです。
適用済みのmigrationをDBから消して、migrationを再実行する
最悪の場合はロールバックできなくて、手動で新規追加された外部キー、インデックス、コラム、テーブルなどを消さないと行けない。
show create table table-name
-- 外部キー削除
alter table table-name drop foreign key key-name
-- インデックス削除
alter table table-name drop index index-name
-- コラム削除
alter table table-name drop column column-name
全部消し終わったら、rake db:migration:status
で状況を確認して、schema_migrationsテーブルからいらないversionを消してから、再度migrationを実行するとうまく行けるはずです。
注意: schema_migrationsテーブルからいらないversionを消さないと対するmigrationを再実行できないので、ご注意。