본문 바로가기
MySql

MySQL 실패한 Rails 마이그레이션 롤백

by 베이스 공부 2020. 10. 1.
반응형

실패한 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

 

 

반응형

댓글