[python] 내 남쪽 마이그레이션이 작동하지 않는 이유는 무엇입니까?
먼저 데이터베이스를 만듭니다.
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입니다.
답변
South를 사용하면 새 앱으로 처음 시작할 때 테이블이 아직 데이터베이스에 추가되지 않은 경우 마이그레이션을 만들 수있을뿐만 아니라 데이터베이스에 이미 테이블이있는 레거시 앱에 대한 마이그레이션을 만들 수 있습니다. 핵심은 언제 무엇을해야하는지 아는 것입니다.
첫 번째 실수는 마이그레이션을 삭제 한 다음 syncdb를 실행했을 때입니다. Django는 더 이상 해당 앱을 남쪽에서 관리하기를 원한다는 사실을 몰랐기 때문에 테이블을 만들었습니다. 초기 마이그레이션을 만든 다음 마이그레이션을 실행했을 때 south는 django가 이미 만든 테이블을 만들려고 시도했기 때문에 오류가 발생했습니다.
이 시점에서 두 가지 옵션이 있습니다.
-
데이터베이스에서 벽 앱의 테이블을 삭제 한 다음 실행합니다.
$ py manage.py migrate wall
그러면 마이그레이션이 실행되고 테이블이 생성됩니다. -
초기 마이그레이션 실행 가짜
$ py manage.py migrate wall 0001 --fake
이렇게하면 South에 이미 데이터베이스에 테이블이 있다는 것을 알려줄 것이므로 가짜로하면 south_migrationhistory 테이블에 행이 추가되므로 다음에 마이그레이션을 실행할 때 첫 번째 마이그레이션을 알 수 있습니다. 이미 실행되었습니다.
데이터베이스없이 새로운 프로젝트 설정
- 데이터베이스 생성
- 설치된 앱에 남쪽 추가
- syncdb를 실행하면 django 및 south 테이블이 데이터베이스에 추가됩니다.
- 앱 추가
- 각 앱 실행에 대해 앱에
python manage.py schemamigration app_name --initial
대한 초기 마이그레이션 파일이 생성됩니다. - 그런 다음 south migrate를 실행
python manage.py migrate app_name
하면 데이터베이스에 테이블이 추가됩니다.
레거시 프로젝트 및 데이터베이스 설정
- 설치된 앱에 남쪽 추가
- syncdb를 실행하면 데이터베이스에 south 테이블이 추가됩니다.
- 실행되는 각 앱에 대해
python manage.py schemamigration app_name --initial
초기 마이그레이션이 생성됩니다. - 각 앱 실행
python manage.py migrate app_name 0001 --fake
에 대해 이것은 남쪽으로 가짜로 만들어지고 해당 모델에 대한 데이터베이스에 아무 작업도 수행하지 않으며 south_migrationhistory 테이블에 레코드를 추가하기 만하면 다음에 마이그레이션을 생성 할 때 모두 가능합니다. 세트.
데이터베이스없이 레거시 프로젝트 설정
- 데이터베이스 생성
- 설치된 앱에 남쪽 추가
- 실행되는 각 앱에 대해
python manage.py schemamigration app_name --initial
초기 마이그레이션이 생성됩니다. - syncdb를 실행하면 마이그레이션이없는 모든 앱이 데이터베이스에 추가됩니다.
- 그런 다음 south migrate
python manage.py migrate
를 실행하면 앱에 대한 모든 마이그레이션이 실행됩니다.
이제 south를 설정 했으므로 south를 사용하여 해당 앱의 모델 변경을 관리 할 수 있습니다. 실행하는 가장 일반적인 명령 python manage.py schemamigration app_name migration_name --auto
은 마지막으로 실행 한 마이그레이션을 살펴보고 변경 사항을 찾아 마이그레이션 파일을 빌드하는 것입니다. 그런 다음 실행 python manage.py migrate
하면 데이터베이스가 변경됩니다.
도움이 되었기를 바랍니다.
답변
이것이 내가 일을 작동시키는 방법입니다.
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 -남쪽 설명 /
답변
상태를 사용중인 자습서 :
(south_migrationhistory가 존재하지 않는다는 불평이 실패하면 South 설치 후 syncdb를 실행하는 것을 잊은 것 입니다.)
게시물이 수행 한 단계를 정확하게 설명한다고 가정하면 해당 링크를 따라 가면 새 앱을 설정하기 전에 단계를 놓친 것으로 보입니다. 새 애플리케이션에서 마이그레이션을 설정하기위한 자습서를 따르고 있으므로 순서는 다음과 같습니다.
- 에 남쪽 을 추가 합니다
INSTALLED_APPS
. - 을 실행
syncdb
합니다. - 그런 다음 튜토리얼을 따르십시오.
즉, syncdb
새 앱의 모델에 추가하기 전에 이미 실행 했어야 합니다. 앱을 제거하는 솔루션 INSTALLED_APPS
이 작동해야하지만 이전 단계를 놓 쳤기 때문에 실제로는 “어리석은”해결 방법 일뿐입니다. syncdb
해당 앱에 대한 모델을 만들기 전에 실행 했다면 해결 방법을 사용할 필요가 없습니다.
답변
미래 심판을 위해. South가 당신에게 문제를주는 경우 :
- 앱 디렉터리에서 마이그레이션 디렉터리를 제거합니다.
- 데이터베이스에서 South _migrations 삭제
- manage.py syncdb 실행
- South 사용으로 돌아 가기 (예 : ‘./manage.py convert_to_south something, ./manage.py migrate …’)
답변
이것은 분명해 보이지만 문서를 읽는 것이 좋습니다.
이 질문에 대한 답을 읽은 후에도 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 기사를 읽어보십시오.
답변
South가 모든 작업과 올바르게 동기화되도록하려면 어떻게해야합니까? 내가 생각할 수있는 유일한 것은 INSTALLED_APPS에서 내 앱을 제거한 다음 syncdb를 실행 한 다음 다시 추가하는 것입니다.
나는 과거에 남부 문제에 대한 수정을 사용했습니다. 예쁜 해결책은 아니지만 매우 효과적입니다.)
그러나 주요 문제는 주문이 정확하지 않다는 것입니다. 가이드를 시작하기 전에 syncdb를 실행해야합니다. 제대로 작동하는 것보다.