2014-03-27 4 views
1

나는 보존하고 싶은 사용자 데이터와 함께 Heroku에서 Django 5.1 웹 응용 프로그램을 실행하고 있습니다.Django 1.5 : 테이블을 삭제하지 않고도 South를 사용하여 기존 테이블에 새 모델 필드를 추가하려면 어떻게해야합니까?

로컬에서는 새 모델 char을 기존 모델에 추가 했으므로 Heroku에 연결할 때 아무 것도 부러 뜨리지 않으려 고합니다. 나는 장고 6이 migrate 명령을 소개했음을 알고 있지만, 장고 5에는 그런 것이 없다. 나만 South 이전 도구가 있습니다.

South basic tutorial을 로컬로 (내 sqlite3 db에) 따라 갔는데, Heroku에서 '진짜'를 실행했을 때 아무 것도 깨지지 않았는지 확인하려고했습니다. 모든 것은 내가 DROP 그 세 테이블에 강제

(venv)$ python manage.py migrate forecasts 
Running migrations for forecasts: 
- Migrating forwards to 0002_auto__add_field_day_weather. 
> forecasts:0001_initial 
FATAL ERROR - The following SQL query failed: CREATE TABLE "forecasts_region" ("id" integer NOT NULL PRIMARY KEY, "url" varchar(200) NOT NULL UNIQUE, "name" varchar(200) NOT NULL, "nickname" varchar(10) NOT NULL) 
The error was: table "forecasts_region" already exists 
! Error found during real run of migration! Aborting. 

! Since you have a database that does not support running 
! schema-altering statements in transactions, we have had 
! to leave it in an interim state between migrations. 

! You *might* be able to recover with: = DROP TABLE "forecasts_region"; [] 
    = DROP TABLE "forecasts_day"; [] 
    = DROP TABLE "forecasts_tide"; [] 

! The South developers regret this has happened, and would 
! like to gently persuade you to consider a slightly 
! easier-to-deal-with DBMS (one that supports DDL transactions) 
! NOTE: The error which caused the migration to fail is further up. 
Error in migration: forecasts:0001_initial 
DatabaseError: table "forecasts_region" already exists 

, 그럼 다음 python manage.py migrate forecasts, python manage.py syncdb를 다시 실행 ... 끊었다. 이것은 새로운 필드를 추가했지만,이 세 테이블에서 모든 데이터를 잃었습니다.

저는 입니다.의 라이브 버전을 망친 것 같습니다. 그래서 무엇을하고, 어떤 순서로합니까? 모범 사례를 포함 할 수 있다면, 문제가 발생했을 때를 대비하여 데이터를 보존하는 것이 좋습니다. 또한, South을 사용한 적이 없기 때문에,이 손으로 나를 붙잡아주십시오. 감사!

답변

4

데이터베이스 마이그레이션을 위해 Django South를 사용하는 것이 맞습니다. 위에서 실행 한 문제점은 데이터베이스에 이미 테이블이 생성되어 있다는 것입니다. South를 사용하면 처음으로 마이그레이션을 실행할 때 "가짜"마이그레이션을 수행 할 수 있으므로 이미 존재하는 테이블을 만들려고하지는 않습니다.

는 현재 http://south.readthedocs.org/en/latest/convertinganapp.html#converting-an-app 설명 된 바와 같이, 사우스 기존 응용 프로그램을 변환 남쪽 명령을 시도하거나 다음을 시도 할 수 있습니다 :

  1. 는 데이터베이스의 모든 테이블을 만듭니다. 먼저

    python manage.py migrate forecasts --fake 
    
  2. 받는 사람의 변화를 확인

    python manage.py syncdb 
    
  3. python manage.py schemamigration --initial forecasts 
    
  4. 가짜 마이그레이션으로 적용 남쪽으로 초기 마이그레이션을 만들기 프로젝트를 시작했을 때이를 실행 예측 모델.

  5. 지금 바로

    python manage.py migrate forecasts 
    
+0

예, 저는 ./manage.py convert_to_south myapp'을 사용하지 않았습니다. 제공된 오류 메시지를 고려할 때 이것이 문제라고 생각합니까?그것은 내가 sqlite3 데이터베이스를 사용하고 있다는 사실과 관련이있는 것처럼 보였습니다. 또한 문제가 발생했을 때를 대비하여 데이터를 백업하는 방법에 대한 정보를 얻으실 수 있습니까? – sgarza62

0

좋아 단일 ALTER 명령을 것이다, 그 이동을 적용하여 새로운 변화

python manage.py schemamigration --auto forecasts 
  • 에 대한 마이그레이션을 작성, 나는 나가를 찾은 것 같아요 로컬 및 Heroku에서 South를 사용하기위한 좋은 단계별 절차 (blog부터) :

    • 설정을 엽니 다.평 및
      • 실행 syncdb 로컬 INSTALLED_APPS 목록에 '남쪽'추가
        • python django_project/manage.py syncdb
    • 남쪽을 사용하는 프로젝트를 변환 :
      • python django_project/manage.py convert_to_south django_app
    • 는 django_project하는 새로운 필드를 추가/django_app/models.py
    • 스키마 설정 :
      • python django_project/manage.py migrate django_app
      • :
        • python django_project/manage.py schemamigration django_app --auto
      • 마이그레이션을 수행을
    • South Heroku 프로젝트의 requirements.txt 파일을 추가하십시오. 예를 들어 :
    • South==0.7.3 버전 제어 에 남쪽 django_project/마이그레이션 디렉토리를 추가하고 모든 변경 사항을 커밋합니다.
      • heroku run bin/python django_project/manage.py syncdb
    • 에 django_app의 당신에게 Heroku 인스턴스를 변환 : Heroku가에
      • git push heroku master
    • 실행 syncdb를 :
    • 는 Heroku가에 변경 내용을 밀어 ,
      • heroku run bin/python django_project/manage.py migrate django_app

    그냥 경우에, 당신에게 Heroku에 포스트 그레스 DB를 백업 할 수 있습니다 : 사우스

    • heroku run bin/python django_project/manage.py convert_to_south django_app
  • 마이그레이션을 수행를 사용 설명대로 PG Backups plugin을 사용하십시오. d here.