8
6

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

汚れたDB上でmigrationをやり直す

Last updated at Posted at 2018-06-05

環境

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を再実行できないので、ご注意。

8
6
0

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
8
6

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?