2016-08-24 3 views
2

레일 및 포스트그레스를 사용하고 있습니다. 나는 현재 Like 테이블을 만들었습니다. 이 테이블을 삭제하고 다시 작성해야합니다. 지금까지 내가 한 일이 여기있다.레일에서 테이블 다시 만들기

1) create_likes 마이그레이션 파일의 이름을 create_likes_old으로 바꾸십시오. 그러면 마이그레이션 내에서 파일 이름과 충돌이 발생하지 않습니다.

2) 마이 그 레이션하는 테이블의 이름을 create_table :likes에서 create_table :likes_old으로 변경하십시오.

3) Like라는 테이블을 만드는 새로운 create_likes 마이그레이션을 생성하십시오. 이것은처럼 테이블이 LikeOld로 이름이 변경되지 않았다 것처럼 보인다하게

PG::DuplicateTable: ERROR: relation "likes" already exists 

: 나는 rake db:migrate을 실행할 때

현재 나는 다음과 같은 문제로 실행 해요. 무엇이 잘못되었으며 어떻게 해결할 수 있습니까?

+0

이 테이블은 이미 데이터베이스에 있습니다. 그것을 버리거나 이름을 바꿔야합니다. 또는 새로운 이름을 바꾸지 않고 오래된 테이블을 삭제 한 다음 다시 만들 수 있습니다. 두 번째 방법은 미래를 위해 안전하기 때문에 더 낫다 – AndreyS

답변

4

콘텐츠를 변경하면 이전 마이그레이션이 실행되지 않으며 으로 이름을 바꾸면 안됩니다. 실행 된 경우에도 create_table :likescreate_table :old_likes으로 변경하면 기존 테이블의 이름을 변경할 수 없습니다. 그건 create_table이 아닙니다. 기껏해야이 마이그레이션을 다시 실행하면 내용이없는 old_likes이라는 새 테이블이 생성되고 이전 likes 테이블은 영향을받지 않습니다. 실제로는 이동을 다시 실행하는 것은 단순히 을 실행 취소하여 마이그레이션을 먼저 실행하고 아직 존재하지 않는 테이블 old_likes을 삭제하는 것입니다.

rename_table을 사용하여 실제로 테이블의 이름을 바꾸는 rename_likes_to_old_likes이라는 새 마이그레이션을 만들어야합니다. 그런 다음, 다음 중 하나를 당신이

또는

  • 는 고유 한 이름과 같은과 새로운 마이그레이션을 만들 때와 같은 이름으로 새 마이그레이션을 도입 할 수 있도록

    • 는 완전히 이전 마이그레이션을 삭제 create_new_likes_table 또는 그와 유사한 번호를 입력하고 새 테이블을 입력하십시오.
+0

나는 왜 그런 일을 할 수 있는지 설명하는 Stackoverflow 대답을 읽고 그것이 30 점 이상을 가지고 있다고 맹세한다. 나는 그것을 찾을 수 있었으면 좋겠다. 나는 솔직히 너를 믿는다. 재미있는 점은 내 독창적 인 아이디어가 한 지점에서 작동했지만 git 문제로 인해 모든 것을 날려 버린 파일 하나 또는 두 개를 잃어 버렸습니다. 나는 이것이 지금 분류되어서 다행이다. – jason328

+0

"동일한 이름으로 새 이전을 도입 할 수 있습니다"- 마이그레이션 이름에는 타임 스탬프가 포함되므로 이전 이름을 삭제할 필요가 없으며 고유 한 이름을 지정할 수 있습니다. –

+0

@ jason328 컨텍스트가 누락되었을 수 있지만 'rake db : migrate : redo VERSION = <이전 ID>를 사용하여 명시 적으로 해당 마이 그 레이션을 다시 실행하지 않으면 이전 마이그레이션을 변경해도 아무런 효과가 없다고 절대 확신 할 수 있습니다. '라고 말하고, 당신이 설명하는 마이그레이션을 위해이를 실행하려한다면, 아직 존재하지 않는'old_likes'라는 테이블을 삭제하려고 시도 할 것이기 때문에 실패 할 것입니다. – meagar

관련 문제