실패한 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 이전의 마지막 마이그레이션이었습니다. (그리고 마이그레이션 출력에 버전 번호가 포함되어 있으면 좋을 것입니다.)
따라서 실패한 마이그레이션 SimpleTest에 대해 아래로 실행 해 보겠습니다.
아무 일도 일어나지 않으며 출력도 없습니다. 하지만 어쨌든 마이그레이션을 실행했을까요? 따라서 SimpleTest 마이그레이션에서 구문 오류를 수정하고 다시 실행 해 보겠습니다.
아니. 분명히 migrate : down이 작동하지 않았습니다. 실패하지 않고 실행되지 않습니다.
데이터베이스에 수동으로 들어가 제거하고 테스트를 실행하는 것 외에는 중복 테이블을 제거 할 방법이 없습니다. 그것보다 더 나은 방법이 있어야합니다.
해결 방법
불행히도 MySQL에 대해 실패한 마이그레이션을 수동으로 정리해야합니다. MySQL은 트랜잭션 데이터베이스 정의 변경을 지원하지 않습니다.
Rails 2.2에는 PostgreSQL 용 트랜잭션 마이그레이션이 포함되어 있습니다. Rails 2.3에는 SQLite에 대한 트랜잭션 마이그레이션이 포함되어 있습니다.
이것은 지금 당장 문제에 도움이되지는 않지만 향후 프로젝트에서 데이터베이스를 선택할 수있는 경우 마이그레이션이 훨씬 더 즐겁기 때문에 트랜잭션 DDL을 지원하는 데이터베이스를 사용하는 것이 좋습니다.
업데이트-Alejandro Babio가 여기에 또 다른 답변으로보고 한 Rails 4.2.7 및 MySQL 5.7에서 2017 년에도 마찬가지입니다.
참조 페이지 https://stackoverflow.com/questions/686852
'MySql' 카테고리의 다른 글
MySQL 데이터베이스에 아랍어로 데이터 저장 (0) | 2020.10.01 |
---|---|
MySQL에서 테이블 이름의 최대 길이 (0) | 2020.10.01 |
MySQL Unix time to Date in Mysql (0) | 2020.10.01 |
MySQL Oracle에 연결하기 위해 mysql에서 SID를 찾는 방법 (0) | 2020.10.01 |
MySQL에서 정수 (문자열로 렌더링)는 몇 개의 문자를 사용합니까? (0) | 2020.09.30 |
댓글