Rails でマイグレーションが失敗する恐怖から解放される感動的なすごい方法
開発中に rake db:migrate がエラーで中断しても、元に戻す方法がわからない。スキーマを書き換える SQL なんて覚えてない。失敗したのにスキーマのバージョンだけ上がったりする。
こういった問題を解決する、感動的なすごい方法があるのでは、と思って調べてたんだけど、見つけられなかった。
バックアップしてテスト環境で実行するのがよさそうです。普通です。
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);