program story

기존 모델의 변경 사항을 반영하도록 django 데이터베이스 업데이트

inputbox 2020. 11. 6. 08:12
반응형

기존 모델의 변경 사항을 반영하도록 django 데이터베이스 업데이트


나는 이미 모델을 정의하고 manager.py syncdb. 모델에 일부 필드를 추가 했으므로 syncdb다시 시도 했지만 출력이 나타나지 않습니다. 내 템플릿에서 이러한 새 필드에 액세스하려고하면 "No Such Column"예외가 발생하여 syncdb가 실제로 데이터베이스를 업데이트하지 않았다고 생각합니다. 여기서 올바른 명령은 무엇입니까?


필요한 것은 마이그레이션 시스템 인 것 같습니다. South 는 정말 훌륭하고 훌륭하게 작동하며 워크 플로우를 용이하게하는 몇 가지 자동화 도구가 있습니다. 그리고 훌륭한 튜토리얼이 있습니다.


참고 : syncdb는 기존 테이블을 업데이트 할 수 없습니다. 자동으로 무엇을할지 결정하는 것이 불가능한 경우가 있습니다. 그래서 남쪽 스크립트가 이처럼 훌륭합니다.


Django 1.7+부터 기본 제공 마이그레이션 지원 은 데이터를 보존하는 데이터베이스 스키마 마이그레이션을 허용합니다. 아래 솔루션보다 더 나은 접근 방식 일 것입니다.

추가 앱이 필요하지 않은 또 다른 옵션은 내장 된 manage.py기능을 사용하여 데이터를 내보내고 데이터베이스를 지우고 내 보낸 데이터를 복원하는 것입니다.

아래 메소드는 앱의 데이터베이스 테이블을 업데이트하지만 해당 테이블에 존재 하는 모든 데이터를 완전히 파괴 합니다. 앱 모델을 변경해도 이전 스키마가 손상되지 않는 경우 (예 : 새로운 선택적 필드를 추가 한 경우) 다음과 같이 데이터를 이전에 덤프하고 나중에 다시로드 할 수 있습니다.

Django 1.4.15 이하

python manage.py dumpdata <your_app> > temp_data.json
python manage.py reset <your_app>
python manage.py loaddata temp_data.json

Django 1.5 이상

python manage.py dumpdata <your_app> > temp_data.json
python manage.py sqlclear <your_app> | python manage.py dbshell
python manage.py syncdb
python manage.py loaddata temp_data.json

(이 reset명령은 더 이상 사용되지 않고 Django 1.5 에서 제거되었습니다. )

변경 사항으로 인해 이전 스키마가 깨지면 작동하지 않습니다.이 경우 South 또는 Django Evolution 과 같은 도구 가 좋습니다.


Django 1.7부터는 이제 네이티브 마이그레이션으로이를 수행 할 수 있습니다. 그냥 달려

python manage.py makemigrations <your app name>
python manage.py migrate

Django의 syncdb는 데이터베이스의 기존 테이블을 변경하지 않으므로 수동으로 수행해야합니다. 내가 항상하는 방식은 :

  1. 먼저 모델 클래스를 변경하십시오.
  2. 그런 다음 manage.py sql myapp을 실행하십시오.
  3. 그것이 출력하는 SQL을보고 그것이 당신이 만들려고하는 변화를 어떻게 표현했는지보십시오.
  4. 데이터베이스 관리자를 사용하여 수동으로 변경하십시오.
  5. 관리 사이트를 사용하여 모든 것이 올바르게 작동하는지 확인하십시오.

sqllite를 사용하는 경우 좋은 관리자는 firefox 플러그인입니다. link


또 다른 도구는 장고 진화입니다. 대부분의 경우 테이블 삭제가 필요하지 않습니다.

장고 진화

다른 django 앱으로 설치하고 실행하십시오.

python manage.py evolve --hint --execute


deseb 는이를위한 훌륭한 도구입니다.

설치되면 ./manage.py sqlevolve를 작성할 수 있으며 데이터베이스 구조를 모델과 동기화 상태로 유지하는 데 필요한 SQL 명령을 생성합니다.


을 사용하여 테이블을 다시 만들려면 먼저 테이블을 삭제해야합니다 syncdb.

기존 데이터를 보존하려면 데이터베이스를 언로드하고 테이블을 삭제하고 실행 syncdb하여 새 데이터베이스를 만든 다음 이전 데이터를 새 테이블로 다시로드해야합니다.

이를 도와주는 도구가 있습니다. 그러나 대부분의 경우 수동으로 수행하는 것만 큼 쉽습니다.


버전 1.4.1 이상 사용자의 경우 명령이 다음과 같이 변경되었습니다.

python manage.py flush

모든 데이터를 삭제하므로 사용하기 전에 공식 문서읽으십시오 .

참고 URL : https://stackoverflow.com/questions/1985383/update-django-database-to-reflect-changes-in-existing-models

반응형