Rails でマイグレーションが失敗する恐怖から解放される感動的なすごい方法

開発中に rake db:migrate がエラーで中断しても、元に戻す方法がわからない。スキーマを書き換える SQL なんて覚えてない。失敗したのにスキーマのバージョンだけ上がったりする。

こういった問題を解決する、感動的なすごい方法があるのでは、と思って調べてたんだけど、見つけられなかった。

バックアップしてテスト環境で実行するのがよさそうです。普通です。

以下手順。環境は Rails 3 + MySQL

mysqldump を使って development DB を test にコピーする。バックアップ用の DB も作ってコピー。

$ mysqldump -u root myapp_development | mysql -u root myapp_test
$ mysqldump -u root myapp_development | mysql -u root myapp_backup

うっかり development を操作するのを防ぐため、 RAILS_ENV を test にセット。

$ export RAILS_ENV=test

うまくいくまで、migrate と mysqldump を繰り返す。

$ mysqldump -u root myapp_development | mysql -u root myapp_test
$ rake db:migrate RAILS_ENV=test
$ mysqldump -u root myapp_development | mysql -u root myapp_test
$ rake db:migrate RAILS_ENV=test
:

rollback もテストする。

$ mysqldump -u root myapp_development | mysql -u root myapp_test
$ rake db:migrate db:rollback RAILS_ENV=test
$ mysqldump -u root myapp_development | mysql -u root myapp_test
$ rake db:migrate db:rollback RAILS_ENV=test
:

test 環境でうまくいったら、お祈りして、 development 環境で実行する。development で失敗したらバックアップからコピーしてやり直す。おわり。



その他、使うかもしれない手口メモ。

リポジトリから db/schema.rb を復元して、クリーンな DB を作り直す。作業中、最新の migration でエラーが発生している場合、db:setup は実行できない。

git checkout db/schema.rb
rake db:drop db:create db:schema:load RAILS_ENV=test

最大のバージョン番号を消す SQL 。めんどくさい。

delete from schema_migrations where version = (select x.v from (select max(version) as v from schema_migrations) x);