2012-11-30 3 views
6

DB를 마이 그 레이션하려고 할 때 오류가 발생합니다. , 마이그레이션, 마스터로 다시 전환하고, 레일 DB 마이그레이션 오류 : 관계가 이미 존재합니다.

  • 다른 지점을 만들어 병합 지점 : 나는 완전히 내가 어떻게 왔는지 기억하지 않지만, 내가 생각 :

    1. 는 DB가 새로운 지점, 스캐 폴딩 '요청'을 만들어 약간의 물건 (db)을 옮겼다. 그리고 모든 것이 잘 작동했다.
    2. heroku postgres 데이터베이스에서 가져온 것이므로 실제 데이터가 제대로 작동하는지 테스트 할 수 있습니다. 다음 DB의 마이그레이션을 시도했지만 나에게이 오류 준 :

      rake db:migrate 
      == CreateRequests: migrating ================================================= 
      -- create_table(:requests) 
      NOTICE: CREATE TABLE will create implicit sequence "requests_id_seq1" for serial column "requests.id" 
      rake aborted! 
      An error has occurred, this and all later migrations canceled: 
      
      PG::Error: ERROR: relation "requests" already exists 
      : CREATE TABLE "requests" ("id" serial primary key, "title" character varying(255), "content" text, "category" character varying(255), "status" character varying(255), "requested_track_id" integer, "created_at" timestamp, "updated_at" timestamp) 
      

    어떤 아이디어?

  • +1

    암시 적 시퀀스를 만드는 것에 대한 메시지는 오류가 아니며 단지 알림 (정보 메시지입니다. 이는 활성 레코드가 기본적으로 'id' 열에 대해 자동 증가 열을 사용하는 모든 테이블에 대해 일반적입니다.오류는'requests' 테이블이 이미 존재한다는 것입니다. – qqx

    +0

    그 메시지를받는 경우 어떻게해야합니까? 필자는 마이그레이션을 생성하여 테이블을 삭제 한 다음 마이그레이션을 다시 작성하여 동일한 테이블을 생성함으로써 해결했습니다. 더 좋은 방법이 있습니까? – kibaekr

    +1

    데이터베이스 스키마는 동일한 환경을 가정 한 모든 지점의 최종 결과가 될 것입니다. 분기를 병합 할 때까지는 코드가 실제로 기본 db에서 발생한 일련의 마이그레이션을 표시하지 않아도됩니다. 또한 마이그레이션을 실행할 때 이전 마이그레이션에 대한 검사는 현재 마이그레이션에 대해서만 이루어 지므로 잠재적 충돌을 나타낼 수 있습니다. 하나의 지점에 모든 마이그레이션을 유지하는 것이 좋습니다. –

    답변

    4

    난 당신이 사용하는 전략을 끌어 정확히 모르겠지만, 우리는 당신의 풀 전략에 대한 두 합리적인 가정 할 경우이 덜 필요하기 때문에

    1. 은 단지 테이블을 덮어 데이터베이스를 삭제하지만,하지 않습니다 사용 권한.
    2. 일종의 '보관 모드'로 작동합니다. 즉 원본에 존재하지 않기 때문에 대상의 테이블을 삭제하지 않습니다. Think rsync; 해당 유틸리티로 예상되는 동작을 얻으려면 --delete을 지정해야합니다.

    당신의 단계가 정확하다면, 무슨 일하는 것은 당신이 schema_migrations 테이블을 덮어, 그래서 레일은 아직 테이블을 추가하지 않은 생각하지만, 어느 쪽이 당신에게 Heroku 때문에 위 # 2의 테이블을 삭제 당기했다.

    다른 이전을 만들지 마십시오 !!! 귀하의 컴퓨터를 제외한 모든 컴퓨터에서이 작업이 실패하지만 귀하의 PC에서만 작동합니다.

    대신 rails dbconsole을 실행하고 DROP TABLE 'requests'과 같은 것을 실행하십시오 (postgres 구문이 정확하지 않을 수도 있음). 그런 다음 마이그레이션을 실행할 수 있습니다.

    2

    데이터가 포함 된 표를 삭제하는 다른 방법은 없습니다.

    내가 이러한 경우 수행하는 작업은 실패한 마이그레이션을 확인하는 것입니다.

    db/migrate/20130908214222_create_requests.rb 파일이 있고 "트래킹 시스템"에이 마이그레이션을 저장할 때 ActiveRecord가 과거에 실패했다고 가정합니다.

    이이 schema_migrations 테이블에서 바로 찾을 경우가 있는지 확인하기 위해이 예와 같이 숫자가 포함 된 행 : 해당 행이 존재하지 않는 경우 20130908214222

    , 당신은 새로운 하나를 삽입해야 : 당신이 rake db:migrate 실행

    INSERT INTO schema_migrations(
        version 
    ) VALUES (
        20130908214222 
    ); 
    

    다음 번에, 액티브이 단계를 생략하며, 합병증없이 종료 마이그레이션하는 것입니다.

    관련 문제