문제

저는 제가 시작하는 프로젝트(참고로 브라우저 기반 게임)에 Django를 사용하는 것을 고려하고 있는데 제가 가장 좋아하는 기능 중 하나는 사용하는 것입니다. syncdb 내가 정의한 Django 모델을 기반으로 데이터베이스 테이블을 자동으로 생성합니다(다른 프레임워크에서는 찾을 수 없는 기능).나는 이미 이것을 TV에서 봤을 때 사실이 되기에는 너무 좋다고 생각했습니다. 선적 서류 비치:

Syncdb는 기존 테이블을 변경하지 않습니다.

syncdb는 아직 설치되지 않은 모델에 대한 테이블만 생성합니다.설치 후 모델 클래스에 대한 변경 사항을 일치시키기 위해 ALTER TABLE 문을 실행하지 않습니다.모델 클래스와 데이터베이스 스키마에 대한 변경에는 종종 어떤 형태의 모호성이 포함되며, 이러한 경우 Django는 올바른 변경 사항을 추측해야 합니다.이 과정에서 중요한 데이터가 손실될 위험이 있습니다.

모델을 변경하고 일치하도록 데이터베이스 테이블을 변경하려는 경우 sql 명령을 사용하여 새 SQL 구조를 표시하고 이를 기존 테이블 스키마와 비교하여 변경 사항을 적용합니다.

기존 테이블을 변경하는 작업은 "수동으로" 수행해야 하는 것 같습니다.

내가 알고 싶은 것은 이를 수행하는 가장 좋은 방법입니다.두 가지 솔루션이 떠오릅니다.

  • 문서에서 알 수 있듯이 DB에서 수동으로 변경하십시오.
  • 데이터베이스를 백업하고, 지우고, 테이블을 다시 생성하고(이제 처음부터 테이블을 생성하므로 syncdb를 사용하여) 백업된 데이터를 가져옵니다(데이터베이스가 큰 경우 시간이 너무 오래 걸릴 수 있음).

어떤 아이디어가 있나요?

도움이 되었습니까?

해결책

동일한 주제에 대한 다른 답변에서 언급했듯이 DjangoCon 2008 스키마 진화 패널 YouTube에서.

또한 지도에 두 개의 새로운 프로젝트가 있습니다: 단순 마이그레이션 그리고 철새.

다른 팁

SQL 변경과 덤프/다시 로드를 수동으로 수행하는 것은 모두 옵션이지만 Django용 스키마 진화 패키지 중 일부를 확인하고 싶을 수도 있습니다.가장 성숙한 옵션은 다음과 같습니다. 장고 진화 그리고 남쪽.

편집하다:그리고 안녕, 여기 온다 이민.

업데이트:이 답변은 원래 작성되었으므로 장고 진화 그리고 이민 활발한 개발을 중단했으며 남쪽 Django의 스키마 마이그레이션에 대한 사실상의 표준이 되었습니다.South의 일부는 다음 릴리스 또는 두 릴리스에서 Django에 통합될 수도 있습니다.

업데이트:South(South의 저자인 Andrew Godwin이 작성)를 기반으로 하는 스키마 마이그레이션 프레임워크가 Django 1.7+에 포함되어 있습니다.

이를 수행하는 한 가지 좋은 방법은 고정 장치를 이용하는 것입니다. 특히 initial_data 비품.

Fixture는 데이터베이스의 직렬화된 내용을 포함하는 파일 모음입니다.따라서 이는 데이터베이스를 백업하는 것과 비슷하지만 Django가 인식하는 것이므로 단위 테스트와 같은 작업을 수행할 때 사용하기가 더 쉽고 추가적인 이점이 있습니다.

다음을 사용하여 현재 DB에 있는 데이터에서 고정물을 생성할 수 있습니다. django-admin.py dumpdata.기본적으로 데이터는 JSON 형식이지만 XML과 같은 다른 옵션도 사용할 수 있습니다.비품을 보관하기에 좋은 장소는 fixtures 응용 프로그램 디렉터리의 하위 디렉터리입니다.

다음을 사용하여 Fixture를 로드할 수 있습니다. django-admin.py loaddata 그러나 더 중요한 것은 조명기의 이름이 다음과 같은 경우입니다. initial_data.json 당신이 할 때 자동으로로드됩니다 syncdb, 직접 가져오는 수고를 덜 수 있습니다.

또 다른 이점은 실행할 때 manage.py test 단위 테스트를 실행하기 위해 임시 테스트 데이터베이스에는 초기 데이터 고정 장치도 로드되어 있습니다.

물론 이는 모델에 속성을 추가하고 DB에 열을 추가할 때 작동합니다.데이터베이스에서 열을 삭제하는 경우 간단하지 않을 수 있는 해당 열의 데이터를 제거하기 위해 설비를 업데이트해야 합니다.

이는 개발 중에 작은 데이터베이스 변경을 많이 수행할 때 가장 효과적입니다.프로덕션 DB를 업데이트하는 경우 수동으로 생성된 SQL 스크립트가 가장 잘 작동하는 경우가 많습니다.

나는 django-evolution을 사용해 왔습니다.주의 사항은 다음과 같습니다.

  • 자동 제안은 한결같이 썩었습니다.그리고
  • 지문 기능은 서로 다른 플랫폼의 동일한 데이터베이스에 대해 서로 다른 값을 반환합니다.

즉, 나는 관습을 찾았습니다 schema_evolution.py 접근하기 편리합니다.지문 문제를 해결하려면 다음과 같은 코드를 제안합니다.

BEFORE = 'fv1:-436177719' # first fingerprint
BEFORE64 = 'fv1:-108578349625146375' # same, but on 64-bit Linux
AFTER = 'fv1:-2132605944' 
AFTER64 = 'fv1:-3559032165562222486'

fingerprints = [
    BEFORE, AFTER,
    BEFORE64, AFTER64,
    ]

CHANGESQL = """
    /* put your SQL code to make the changes here */
    """

evolutions = [
    ((BEFORE, AFTER), CHANGESQL),
    ((BEFORE64, AFTER64), CHANGESQL)
    ]

더 많은 지문과 변경 사항이 있으면 다시 고려하겠습니다.그때까지 더 깨끗하게 만드는 것은 다른 것에서 개발 시간을 훔치는 것입니다.

편집하다: 어쨌든 변경 사항을 수동으로 구성하고 있으므로 시도해 보겠습니다. 이민 다음번.

django 명령 확장 Manage.py에 몇 가지 추가 명령을 제공하는 django 라이브러리입니다.그 중 하나는 sqldiff이며, 이는 새 모델로 업데이트하는 데 필요한 SQL을 제공합니다.그러나 이는 '매우 실험적'이라는 평가를 받았습니다.

지금까지 우리 회사에서는 수동 접근 방식을 사용해 왔습니다.자신에게 가장 적합한 것은 개발 스타일에 따라 크게 달라집니다.

일반적으로 프로덕션 시스템에서는 스키마 변경이 많지 않으며 개발에서 프로덕션 서버로의 다소 공식화된 롤아웃이 없습니다.출시할 때마다(1년에 10~20회) 현재 및 향후 프로덕션 브랜치의 채우기 비교를 수행하여 모든 코드를 검토하고 프로덕션 서버에서 변경해야 할 사항을 확인합니다.필요한 변경 사항은 추가 종속성, 설정 파일 변경 사항, 데이터베이스 변경 사항일 수 있습니다.

이것은 우리에게 매우 효과적입니다.모든 것을 자동화하는 것은 틈새 비전이지만 우리에게는 어렵습니다. 마이그레이션을 관리할 수는 있지만 여전히 추가 라이브러리, 서버, 모든 종속성을 처리해야 합니다.

Django 1.7(현재 개발 중)은 기본 지원 추가 스키마 마이그레이션의 경우 manage.py migrate 그리고 manage.py makemigrations (migrate 더 이상 사용되지 않습니다 syncdb).

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top