내 남쪽 마이그레이션이 작동하지 않는 이유는 무엇입니까?


78

먼저 데이터베이스를 만듭니다.

create database mydb;

설치된 Apps에 "south"를 추가합니다. 그런 다음이 자습서로 이동합니다. http://south.aeracode.org/docs/tutorial/part1.html

이 튜토리얼은 다음과 같이 지시합니다.

$ py manage.py  schemamigration wall --initial
>>> Created 0001_initial.py. You can now apply this migration with: ./manage.py migrate wall

좋습니다. 이제 마이그레이션합니다.

$ py manage.py migrate wall

하지만이 오류가 발생합니다 ...

django.db.utils.DatabaseError: (1146, "Table 'fable.south_migrationhistory' doesn't exist")

내가 구글 사용 그래서 (. 작동하지 따라서 내 870 질문에 유래에 요청), 나는이 페이지를 얻을 : http://groups.google.com/group/south-users/browse_thread/thread/d4c83f821dd2ca1c

좋아, 그래서 나는 그 지시를 따른다

>> Drop database mydb;
>> Create database mydb;
$ rm -rf ./wall/migrations
$ py manage.py syncdb

하지만 syncdb를 실행하면 Django는 많은 테이블을 생성합니다. 예, south_migrationhistory 테이블 을 생성 하지만 내 앱의 테이블도 생성합니다.

Synced:
 > django.contrib.admin
 > django.contrib.auth
 > django.contrib.contenttypes
 > django.contrib.sessions
 > django.contrib.sites
 > django.contrib.messages
 > south
 > fable.notification
 > pagination
 > timezones
 > fable.wall
 > mediasync
 > staticfiles
 > debug_toolbar

Not synced (use migrations):
 - 
(use ./manage.py migrate to migrate these)

멋지다 .... 이제 마이그레이션하라는 메시지가 표시됩니다. 그래서 이렇게합니다.

$ py manage.py  migrate wall
The app 'wall' does not appear to use migrations.

좋아, 좋아. 초기 마이그레이션에 벽을 추가하겠습니다.

$ py manage.py schemamigration wall --initial

그런 다음 마이그레이션합니다.

$ py manage.py migrate wall

그거 알아? 이 BS를 제공합니다.

_mysql_exceptions.OperationalError: (1050, "Table 'wall_content' already exists")

죄송합니다. 정말 짜증이납니다. 누군가 도울 수 있습니까? 감사.

South가 모든 작업과 올바르게 동기화되도록하려면 어떻게해야합니까? 내가 생각할 수있는 유일한 것은 INSTALLED_APPS에서 내 앱을 제거한 다음 syncdb를 실행 한 다음 다시 추가하는 것입니다.

정말 SILLY입니다.


6
Ken의 대답은 기본적으로 솔루션이 제공되는 한 정확하지만 잘못된 점을 지적하여 배울 수 있습니다. 마이그레이션 디렉토리를 삭제하는 것이 두 번째 문제였습니다. 깨끗한 DB에서 시작 : 1. 사용하는 앱에 대한 마이그레이션을 만듭니다. 2. syncdb를 실행하고, 3. migrate 명령을 실행합니다. 그러면 syncdb를 사용하여 마이그레이션되지 않은 테이블을 만들고 south를 사용하여 마이그레이션 된 테이블을 만듭니다. 마지막 요점 : syncdb 출력에 "동기화되지 않음 (이전 사용) :"이라고 표시되면 나중에 실제로 나오는 내용을 읽어보십시오. 마이그레이션이 없기 때문에 출력에 마이그레이션 할 항목이 없습니다.
Gabriel Hurley

2
+1 문제에 대한 철저한 분석 제공
Filip Dupanović 2011 년

여러 파일의 클래스를 다루는 경우 모든 파일에 app_label이 있는지 확인하십시오!
andilabs 2015 년

답변:


175

South를 사용하면 새 앱으로 처음 시작할 때 테이블이 아직 데이터베이스에 추가되지 않은 경우 마이그레이션을 만들 수있을뿐만 아니라 데이터베이스에 이미 테이블이있는 레거시 앱에 대한 마이그레이션을 만들 수 있습니다. 핵심은 언제 무엇을해야하는지 아는 것입니다.

첫 번째 실수는 마이그레이션을 삭제 한 다음 syncdb를 실행했을 때입니다. Django는 더 이상 해당 앱을 남쪽에서 관리하기를 원한다는 사실을 몰랐기 때문에 테이블을 만들었습니다. 초기 마이그레이션을 만든 다음 마이그레이션을 실행했을 때 south는 django가 이미 만든 테이블을 만들려고 시도했기 때문에 오류가 발생했습니다.

이 시점에서 두 가지 옵션이 있습니다.

  1. 데이터베이스에서 벽 앱의 테이블을 삭제 한 다음 실행합니다. $ py manage.py migrate wall그러면 마이그레이션이 실행되고 테이블이 생성됩니다.

  2. 초기 마이그레이션 실행 가짜 $ py manage.py migrate wall 0001 --fake이렇게하면 South에 이미 데이터베이스에 테이블이 있다는 것을 알려줄 것이므로 가짜로하면 south_migrationhistory 테이블에 행이 추가되므로 다음에 마이그레이션을 실행할 때 첫 번째 마이그레이션을 알 수 있습니다. 이미 실행되었습니다.

데이터베이스없이 새로운 프로젝트 설정

  1. 데이터베이스 생성
  2. 설치된 앱에 남쪽 추가
  3. syncdb를 실행하면 django 및 south 테이블이 데이터베이스에 추가됩니다.
  4. 앱 추가
  5. 각 앱 실행에 대해 앱에 python manage.py schemamigration app_name --initial대한 초기 마이그레이션 파일이 생성됩니다.
  6. 그런 다음 south migrate를 실행 python manage.py migrate app_name하면 데이터베이스에 테이블이 추가됩니다.

레거시 프로젝트 및 데이터베이스 설정

  1. 설치된 앱에 남쪽 추가
  2. syncdb를 실행하면 데이터베이스에 south 테이블이 추가됩니다.
  3. 실행되는 각 앱에 대해 python manage.py schemamigration app_name --initial초기 마이그레이션이 생성됩니다.
  4. 각 앱 실행 python manage.py migrate app_name 0001 --fake에 대해 이것은 남쪽으로 가짜로 만들어지고 해당 모델에 대한 데이터베이스에 아무 작업도 수행하지 않으며 south_migrationhistory 테이블에 레코드를 추가하기 만하면 다음에 마이그레이션을 생성 할 때 모두 가능합니다. 세트.

데이터베이스없이 레거시 프로젝트 설정

  1. 데이터베이스 생성
  2. 설치된 앱에 남쪽 추가
  3. 실행되는 각 앱에 대해 python manage.py schemamigration app_name --initial초기 마이그레이션이 생성됩니다.
  4. syncdb를 실행하면 마이그레이션이없는 모든 앱이 데이터베이스에 추가됩니다.
  5. 그런 다음 south migrate python manage.py migrate를 실행하면 앱에 대한 모든 마이그레이션이 실행됩니다.

이제 south를 설정 했으므로 south를 사용하여 해당 앱의 모델 변경을 관리 할 수 ​​있습니다. 실행하는 가장 일반적인 명령 python manage.py schemamigration app_name migration_name --auto은 마지막으로 실행 한 마이그레이션을 살펴보고 변경 사항을 찾아 마이그레이션 파일을 빌드하는 것입니다. 그런 다음 실행 python manage.py migrate하면 데이터베이스가 변경됩니다.

도움이 되었기를 바랍니다.


3
좋은 대답이에요, 켄. 당신은 당신의 대답을 편집하여 실제로 그 과정에서 실제로 잘못 된 것을 조금 더 통합하는 것을 생각할 수 있습니다 (위의 내 의견 참조). 당신의 대답을 우연히 발견하는 미래의 사람들이 가능한 최고의 정보를 얻도록하십시오.
Gabriel Hurley 2011 년

@Gabriel 나는 당신이 제안한 것처럼 내 대답에 더 많은 정보를 추가했습니다. 도와 주셔서 감사합니다.
Ken Cochrane 2011 년

1
BTW, 이것은 South가 아닌 프로젝트를 가져와 South를 추가하는 것입니다. 이미 South를 사용하고 실행하는 프로젝트를 얻는 것이 아닙니다. 이러한 경우에는 syncdb 및 마이그레이션 만 있으면됩니다.
Bryan

11

이것이 내가 일을 작동시키는 방법입니다.

pip install South

# add 'south', to INSTALL_APPS, then
python manage.py syncdb

# For existing project + database
python manage.py convert_to_south app_name

# Thereafter, call them per model changes
python manage.py schemamigration app_name --auto
python manage.py migrate app_name

참조 :

http://garmoncheg.blogspot.com/2011/08/django-how-and-why-to-use-migrations.html http://www.djangopro.com/2011/01/django-database-migration-tool -남쪽 설명 /


8

상태를 사용중인 자습서 :

(south_migrationhistory가 존재하지 않는다는 불평이 실패하면 South 설치 후 syncdb를 실행하는 것을 잊은 것 입니다.)

게시물이 수행 한 단계를 정확하게 설명한다고 가정하면 해당 링크를 따라 가면 새 앱을 설정하기 전에 단계를 놓친 것으로 보입니다. 새 애플리케이션에서 마이그레이션을 설정하기위한 자습서를 따르고 있으므로 순서는 다음과 같습니다.

  1. 남쪽 을 추가 합니다 INSTALLED_APPS.
  2. 을 실행 syncdb합니다.
  3. 그런 다음 튜토리얼을 따르십시오.

즉, syncdb새 앱의 모델에 추가하기 전에 이미 실행 했어야 합니다. 앱을 제거하는 솔루션 INSTALLED_APPS이 작동해야하지만 이전 단계를 놓 쳤기 때문에 실제로는 "어리석은"해결 방법 일뿐입니다. syncdb해당 앱에 대한 모델을 만들기 전에 실행 했다면 해결 방법을 사용할 필요가 없습니다.


3

미래 심판을 위해. South가 당신에게 문제를주는 경우 :

  1. 앱 디렉터리에서 마이그레이션 디렉터리를 제거합니다.
  2. 데이터베이스에서 South _migrations 삭제
  3. manage.py syncdb 실행
  4. South 사용으로 돌아 가기 (예 : './manage.py convert_to_south something, ./manage.py migrate ...')

1

이것은 분명해 보이지만 문서를 읽는 것이 좋습니다.

이 질문에 대한 답을 읽은 후에도 South를 효과적으로 사용하는 방법을 이해하는 데 어려움을 겪었습니다.

물론 내가 문서를 읽은 날 모든 것이 바뀌었고 여러분도 역시해야합니다. South는 생각보다 사용하기가 더 간단합니다.

http://south.aeracode.org/docs/about.html

http://south.aeracode.org/docs/tutorial/index.html

http://south.aeracode.org/docs/convertinganapp.html#converting-an-app

나는 또한 이것이 유용하다는 것을 알았다.

http://www.djangopro.com/2011/01/django-database-migration-tool-south-explained/

그리고 데이터베이스 버전 관리에 대한 Jeff Atwood의 Coding Horror 기사를 읽어보십시오.


+1 나는 원숭이가 모든 이상한 남쪽 오류를 수정하는 데 지쳐 있다는 지점에 왔습니다. 슬프게도 남쪽에 관해서는별로 도움이되지 않습니다. 내가 정말로 앉아서 당신이 말한대로 문서를 읽어야 할 것 같습니다.
Philip007

0

South가 모든 작업과 올바르게 동기화되도록하려면 어떻게해야합니까? 내가 생각할 수있는 유일한 것은 INSTALLED_APPS에서 내 앱을 제거한 다음 syncdb를 실행 한 다음 다시 추가하는 것입니다.

나는 과거에 남부 문제에 대한 수정을 사용했습니다. 예쁜 해결책은 아니지만 매우 효과적입니다.)

그러나 주요 문제는 주문이 정확하지 않다는 것입니다. 가이드를 시작하기 전에 syncdb를 실행해야합니다. 제대로 작동하는 것보다.

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