실패한 Rails 마이그레이션을 어떻게 롤백합니까? rake db:rollback
실패한 마이그레이션을 취소 할 것으로 예상 하지만 이전 마이그레이션 (실패한 마이그레이션에서 1을 뺀 마이그레이션)을 롤백합니다. 그리고 rake db:migrate:down VERSION=myfailedmigration
작동하지 않습니다. 나는 이것을 몇 번 만났고 매우 실망 스럽습니다. 다음은 문제를 복제하기 위해 만든 간단한 테스트입니다.
class SimpleTest < ActiveRecord::Migration
def self.up
add_column :assets, :test, :integer
# the following syntax error will cause the migration to fail
add_column :asset, :test2, :integer
end
def self.down
remove_column :assets, :test
remove_column :assets, :test2
end
end
결과:
== SimpleTest : 마이그레이션 ============================================ ======== -add_column (: assets, : test, : integer) -> 0.0932 초 -add_column (: asset, : error) 레이크 중단! 오류가 발생하여 이후의 모든 마이그레이션이 취소되었습니다. 잘못된 인수 개수 (3 개에 2 개)
좋아, 롤백하자.
$ rake db : rollback == AddLevelsToRoles : 되돌리기 ============================================ == -remove_column (: roles, : level) -> 0.0778 초 == AddLevelsToRoles : 되돌림 (0.0779s) =====================================
응? 그것은 실패한 마이그레이션이 아니라 SimpleTest 이전의 마지막 마이그레이션이었습니다. (오, 마이그레이션 출력에 버전 번호가 포함되어 있으면 좋을 것입니다.)
따라서 실패한 마이그레이션 SimpleTest에 대해 아래로 실행 해 보겠습니다.
$ rake db : migrate : down VERSION = 20090326173033 $
아무 일도 일어나지 않으며 출력도 없습니다. 하지만 어쨌든 마이그레이션을 실행했을까요? 따라서 SimpleTest 마이그레이션에서 구문 오류를 수정하고 다시 실행 해 보겠습니다.
$ rake db : migrate : up VERSION = 20090326173033 == SimpleTest : 마이그레이션 ============================================ ======== -add_column (: assets, : test, : integer) 레이크 중단! Mysql :: Error : 중복 열 이름 'test': ALTER TABLE`assets` ADD`test` int (11)
아니. 분명히 migrate : down이 작동하지 않았습니다. 실패하지 않고 실행되지 않습니다.
데이터베이스에 수동으로 들어가서 제거한 다음 테스트를 실행하는 것 외에는 중복 테이블을 제거 할 방법이 없습니다. 그것보다 더 나은 방법이 있어야합니다.