2013-05-08 1 views
12

현재이 애플리케이션의 새로운 기능이있는 거대한 레일 애플리케이션과 여러 가지 브랜치로 작업하고 있습니다. 많은 기능을 마이그레이션해야 할 필요가 있습니다. 마스터와 병합하기 전까지는 문제가되지 않아야합니다. schema.rb가 dev 데이터베이스의 정보로 업데이트되었습니다! schema.rb 다른 지점에서 마이그레이션으로 인해 엉망이되었습니다

는 명확히하기 :

1. Branch A has migration create_table_x 
2. Branch B has migration create_table_y 
3. Branch A adds another create_table_z and runs db:migrate 
4. You want to merge Branch A with Master and you see table_x, table_y and table_z in the schema.rb of Branch A. 

그것은 지점에있는 모든 마이그레이션하기 전에 데이터베이스를 시드 또는 분기마다 데이터베이스를 만들 + 재설정 할 수있는 옵션이 아니다. 거대한 크기의 2GB SQL 데이터로 인해 실행할 수 없습니다.

내 질문 :

정말이 모든 마이그레이션을 다시 도착 이후 저장소에 schema.rb을 유지하기 위해 필요합니까?

그렇다면 데이터베이스 덤프 대신 스키마에서 스키마를 빌드 할 수 있습니까?

+0

당신의 저장소에 schema.rb를 유지해야한다고 생각합니다. 누군가가 이전 파일을 정리하고 과거에 사용하지 않은 몇 가지 마이 그 레이션을 삭제할 수 있습니다. 일정한 schema.rb가없는 경우 엉망이 될 수 있습니다. 스키마 파일은 완전히 다시 작성되지 않고 마이그레이션 할 때마다 갱신됩니다. 그러나 어쨌든 흥미로운 질문입니다. – Mattherick

+0

예, 데이터베이스의 테이블이 부모 또는 분기에 추가되었는지 여부에 관계없이 현재 데이터베이스 구조가 생성되는 문제입니다. 그게 '재건 된'의미였습니다. 누군가가 당신이 마이 그 레이션으로 지점을 전환 할 때마다 마스터에서 데이터베이스를 삭제/복사하는 더 좋은 방법을 알고 있기를 바랍니다 :) – Vikko

+0

가능한 복제본 [git에서 schema.rb를 관리하는 기본 방법은 무엇입니까?] (http : // stackoverflow .com/questions/737854/what-is-the-preferred-way-to-manage-schema-rb-in-git) – Tachyons

답변

9

귀하의 저장소 내에 스키마를 유지해야합니다. 마이그레이션을 실행하면 schema.rb 파일 내의 병합 충돌이 수정됩니다. 내 간단한 질문에

  1. 그것은 필수입니까? 별로,하지만 좋은 연습.

"강하게 버전 제어 시스템에이 파일을 확인하는 것이 좋습니다." -schema.rb

  1. 가능합니까? 그렇습니다.하지만 실제로 수동으로 수행하거나 다른 위치에서 마이그레이션 스키마를 빌드하고 밀어 넣는 방법으로 시간을 절약 할 수 있는지 자문하고 싶을 수도 있습니다.

는 GE

rake db:schema:load 

rake db:schema:dump 
빠른 해결 방법 예를 들어

http://tbaggery.com/2010/10/24/reduce-your-rails-schema-conflicts.html

2

새로운 개발자 (또는 테스트 환경)가 schema.rb에서 새 데이터베이스를 생성 할 수 있기를 원하기 때문에 저장소에 schema.rb를 유지하는 것이 중요합니다. 마이그레이션이 많은 경우, 특히 마이그레이션이 처음 실행될 때보 다 유효하지 않은 모델 클래스가 있거나 존재하지 않거나 변경된 모델 클래스에 의존하는 경우 모두 계속 실행되지 않을 수 있습니다. 테스트를 실행할 때 전체 테스트 스위트를 실행할 때마다 모든 마이그레이션을 다시 실행하지 않고 schema.rb에서 데이터베이스를 덤프하고 다시 작성하려고합니다.

동시에 두 개의 다른 지형지 물에서 작업하고 두 가지 모두에서 데이터베이스 구조를 변경하는 경우 schema.rb가 가장 적은 문제라고 생각합니다. 브랜치 B에서 열의 이름을 변경하거나 제거하면 브랜치 A는 이전 열을 참조 할 때마다 중단됩니다. 그들이 수행하는 모든 작업이 새 테이블을 만드는 경우라면 그리 좋지는 않지만 schema.rb를 master에서 A로 병합 할 때 업데이트하여 A가 두 번째로 마이그레이션을 실행하지 않도록합니다. 새로운 테이블이 이미 존재하기 때문에 실패합니다.

질문에 답변이되지 않는다면 워크 플로를 좀 더 자세히 설명해 주실 수 있습니까?

+0

맞지만 지점 B의 테이블을 원하지 않는다. 마이그레이션)은 브랜치 B를 병합하기 전에 마스터에 표시됩니다. 예 : 브랜치 A와 브랜치 B 모두에서 사용되는 테이블이있는 경우 ** 브랜치 B는 이름을 last_name **으로 변경하고, 브랜치 A는 이니셜을 이름**. 브랜치 A를 병합하면 브랜치 B가 병합되지 않습니다. ** 생성 된 ** 스키마에는 first_name과 last_name **이 포함되어 있지만 ** first_name과 **라는 이름을 사용하고 있습니다. 일부 논리는 마스터가 아닌 마이그레이션을 확인하고 schema.rb에서 롤백하는 것이 좋을 수도 있습니다. – Vikko

+0

처음에는 좋았지 만 일부 마이그레이션은 가역적이지 않을 수도 있습니다. rake db : migrate VERSION = 123 여기서 123은 schema.rb의 마이그레이션 번호입니다. 이 버전으로 이동하려면 필요에 따라 앞으로 또는 뒤로 이동해야합니다. 궁극적으로 체리 피킹으로 수행해야하는 경우에도 가능한 가장 빠른 시간에 마스터로 병합 된 각 지점의 마이그레이션을 적어도 얻는 것이 가장 좋습니다. – sockmonk

+1

그 점을 알고 있습니다.하지만이 문제는 약 20 개 지점에서 일하고 있습니다. 몇 시간에서 몇 달 사이의 수명이 있습니다. 합병증이있는 곳 : 지점에 이전이 있었음을 잊어 버렸습니다. ! 그 외에도 큰 테이블 (100.000 + 레코드)의 마이그레이션은 오래되었습니다. 테이블을 현재 브랜치에서 사용하지 않는다면 스키마를 개발 용으로두고 스키마 만 업데이트하면됩니다. – Vikko

1

신선한 임시 DB를 사용 발발했습니다 추가 혜택은 다음과 같이 언제든지 너를 특정 분기에 꽤 db/schema.rb 필요

  1. 자식 체크 아웃 - dB/schema.rb을
  2. 는 다른 개발 데이터베이스로 전환, 즉 업데이트 설정/database.yml을
  3. 레이크 DB는 : & & 레이크 DB를 드롭 : 설치
  4. 레이크 DB는 :/database.yaml
  5. ,369
  6. 는 설정의 변화를 되돌릴
  7. 이 예쁜 dB/schema.rb 커밋 마이그레이션
관련 문제