django syncdb 및 업데이트 된 모델


86

최근에 내 모델을 업데이트하고 BooleanField를 추가했지만 그렇게 할 때 python manage.py syncdb모델의 데이터베이스에 새 필드를 추가하지 않습니다. 이 문제를 어떻게 해결할 수 있습니까?


17
Django가 기본적으로 이러한 기본 기능을 지원하지 않는다는 사실로 인해 Django를 사용하여 모델을 만들지 못했습니다. 테이블 생성을 처리하지만 (인플레 이스) 테이블 수정을 처리하지 않는 ORM을 릴리스 품질로 간주한다는 사실은 거의 Django를 완전히 사용하지 못하게했습니다.
Glenn Maynard

3
Django가 이러한 훌륭한 앱 플러그 가능성을 허용한다는 사실은 Django를 멋지게 만들고 기본적으로 테이블 수정에 대한 기본 제공 지원이 부족하다는 것을 의미합니다. 앱 설치가 얼마나 어렵습니까?
Dominic Rodger

@Glenn, 디자인 단계에서 모델을 올바르게 계획하면이 문제가 발생하지 않습니다. 새로운 기능을 추가하는 경우 South와 같은 마이그레이션 제품군을 사용하십시오. 내부 마이그레이션은 종종 복잡합니다. 어쨌든 간단한 Django 관리 명령에는 너무 복잡합니다.
Soviut

답변:


100

Django 1.7 이상

Django는 마이그레이션 지원 기능을 내장 하고 있습니다 . 문서를 살펴보세요 .

Django 1.6 이하

Django는 기본적으로 마이그레이션을 지원하지 않습니다. 그래도 정확하게 작동하는 Django 용 플러그 형 앱이 있으며 훌륭하게 작동합니다. 그것은 남쪽 이라고 불립니다 .


1
참고 : 사용자 지정 db 백엔드 (예 : django-mssql)로 모델을 마이그레이션하는 데 South를 사용하는 데 문제가있었습니다.
Don

1
남쪽은 아주 좋은 것입니다! 팁 주셔서 감사합니다
Julien Greard 2014-04-22

14

Django는 현재이 작업을 자동으로 수행하지 않습니다. 옵션은 다음과 같습니다.

  1. 데이터베이스에서 테이블을 삭제 한 다음 syncdb를 사용하여 새 형식으로 다시 만듭니다.
  2. 를 사용하여 데이터베이스에 대한 SQL을 인쇄하고 python manage.py sql (appname)필드에 추가 된 줄을 찾은 다음 alter tableSQL 명령을 사용하여 수동으로 추가합니다 . (이렇게하면 현재 레코드에 대한 필드 값을 선택할 수도 있습니다.)
  3. South를 사용하십시오 ( Dominic의 대답에 따라 ).

11

이 단계를 따르세요:

  1. dumpdata 관리 명령을 사용하여 데이터를 조명기로 내보내기
  2. 테이블 버리기
  3. syncdb 실행
  4. loaddata 관리 명령을 사용하여 조명기에서 데이터를 다시로드합니다.

제자리에서 수행해야하는 작업에 대한 완전한 드롭 및 재 장전? 끔찍합니다.
Glenn Maynard

3
마이그레이션 제품군이 아닌 간단한 관리 명령입니다! Django는 데이터가 어떻게 변경되었는지 또는 데이터를 보존하는 방법을 예측할 방법이 없으므로 직접 수행해야합니다. 마음에 들지 않으면 South와 같은 마이그레이션 도구를 사용하십시오.
Soviut

8

최고의 답변에서 제안했듯이 South를 사용해 보았고 모호한 마이그레이션 오류 로 한 시간 동안 좌절 한 후 대신 Django Evolution을 사용 하기로 결정했습니다 .

South보다 시작하는 것이 더 쉽다고 생각하고 처음 타자했을 때 완벽하게 작동 ./manage.py evolve --hint --execute했기 때문에 만족합니다.


7
Django Evolution과 South를 거의 1 년 동안 사용한 후 저는 제 의견을 바꾸고 있습니다. 남쪽은 굉장합니다. 그러나 그것은 의미에서 힘내 같은 아주 많이 있어요 당신은 당신이 할 필요가 실제로 어떻게 작동하는지 이해 . 맹목적으로 명령을 입력하는 경우 처음으로 본인이나 팀원이 실수를하면 실수 할 가능성이 큽니다.
Dan Abramov

2

Havent는 한동안 django를 사용했지만 syncdb가 db 테이블에서 alter 명령을 수행한다는 것을 기억하는 것 같습니다. 테이블을 삭제 한 다음 다시 실행하면 다시 생성됩니다.

편집 : 죄송합니다 변경을 수행하지 않습니다.


그런 다음 alter table명령을 실행하는 것이 아니라 명령을 실행 create table합니다.
Dominic Rodger

글쎄요 DB에 데이터가 있으므로 떨어지지 않고이 문제를 극복하면 좋을 것입니다.
Hellnar

1
syncdb는 alter 명령을 수행하지 않는다고 말하고 싶었습니다. 테이블을 삭제할 필요가 없으며 SQL에 새 필드를 수동으로 추가 할 수도 있습니다.
Odif Yltsaeb

예,하지만 질문은 syncdb의 사용을 언급하고 있었으므로이 경우 syncdb를 사용하거나 아래에 언급 된 플러그인을 사용하려면 테이블을 삭제해야합니다.
Alex H

1
South에 불만이 있다면 대신 Django Evolution을 사용해보세요. 나를 위해 잘 일했습니다. stackoverflow.com/questions/1605662/…
Dan Abramov

1

장고 1.6에서

  • 처음에 우리는 실행했습니다- python manage.py sql <app name>

  • 그런 다음 실행해야합니다. python manage.py syncdb


0

Apache 및 MySQL과 함께 Django를 실행하는 경우 makemigrations로 마이그레이션 한 후 apache를 다시 시작 하십시오 .

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.