2013-02-16 2 views
3

Heroku는 명확하게 그들이 실행되었을 때 실행되지 않은 마이그레이션이 있음을 알려줍니다. 한 번의 마이그레이션 뒤에 있습니다. 이 문제를 어떻게 해결할 수 있을까요?Heroku rake db : migrate

rake db:migrate을 실행하면 rake aborted Mysql2::Error: Duplicate column name이 표시됩니다. 나는이 필드가 이미 만들어져 있다는 것을 알고 있으며, 다른 마이 그 레이션 및 rake db에는 마이 그 레이션이 존재하지 않기 때문에 마이 그 레이션이 실행되었음을 확신 할 수 있습니다. 마이 그 레이션은 로컬 시스템에서 올바르게 실행됩니다.

어떻게 해결할 수 있습니까? 나는 Heroku가 이미 그 마이그레이션을 실행했다는 것을 깨닫지 못했다고 생각한다. "이미 xxx를 마이그레이션했습니다"라고 어떻게 말할 수 있습니까?

+1

문제가되는 마이그레이션 파일을 삭제하고 더 흥미로운 문제로 이동 하시겠습니까? –

답변

4

아마 한 번 실행했지만 실패했습니다. mysql의 테이블 변경은 트랜잭션 적이 지 않으므로 잘못된 상태로 남을 수 있습니다. 일부 변경 사항이 실행되었을 수 있지만 일부 변경 사항은 실행되지 않았을 수 있습니다.

수행 할 수있는 유일한 작업은 이미 실행 된 부품을 확인하고, 마이그레이션에서 해당 라인을 주석 처리하고, 이미 실행 한 부품을 거치지 않고 마이그레이션을 커밋 및 푸시하고 실행하는 것입니다.

+0

그래, 그게 내가 현재하고있는거야. 나는 단지 그것이 달렸고 전에 실패했다면 그 모든 분야가 왜 그것을 DB로 만들었는지 이상하지 않다고 생각합니다. – botbot

+0

+1 답장을 감사드립니다. – botbot

1

마이그레이션이 불완전하게 적용되는 경우, 다음 중 하나를 수행 적용된 변경 사항을 취소

  • 사용 dbconsole을하고 다시 마이그레이션을 실행하거나
  • 수동으로 나머지 스키마 변경 dbconsole을 사용하고 schema_migrations 테이블에 레코드를 삽입하십시오.

마이그레이션 스크립트의 변경 유형에 따라 위의 항목 중 가장 쉬운 것이 무엇인지 결정해야합니다. 이미 적용된 변경 사항이 컬럼 또는 테이블 삭제와 같은 파괴적인 변경 사항 인 경우, 컬럼 또는 테이블을 다시 작성하여 마이그레이션을 실행할 수 있습니다. 나머지 변경 사항이 SQL로 쉽게 변환 될 수 있다면 더 쉽습니다.

테이블에 schema_migrations 테이블에 레코드를 삽입하면 앱이 이전이 성공적으로 적용된 것으로 생각할 수 있습니다. 마이그레이션 변경 사항이 완전히 적용되었다고 완전히 확신하는 경우에만이 작업을 수행하십시오. 하나의 열 version이 있으며, 이주 파일 이름의 숫자 부분을 포함해야합니다. http://guides.rubyonrails.org/migrations.html

http://api.rubyonrails.org/classes/ActiveRecord/Migration.html

마지막으로,이 대신 MySQL을의 포스트 그레스를 사용해야하는 이유의 예입니다. Postgres는 (대부분의) 스키마 변경 사항을 트랜잭션에서 롤백 할 수 있기 때문에 절반 만 적용된 마이그레이션은 남지 않습니다.

관련 문제