[django] Django South-테이블이 이미 존재합니다

South를 시작하려고합니다. 기존 데이터베이스가 있고 South ( syncdb, schemamigration --initial)를 추가했습니다 .

그런 다음 models.py필드를 추가하고 실행했습니다 ./manage.py schemamigration myapp --auto. 필드를 찾은 것 같았고 이것을 적용 할 수 있다고 말했습니다 ./manage.py migrate myapp. 그러나 그렇게하면 오류가 발생했습니다.

django.db.utils.DatabaseError: table "myapp_tablename" already exists

tablename에 나열된 첫 번째 테이블입니다 models.py.

Django 1.2, South 0.7을 실행 중입니다.



답변

데이터베이스에 이미 테이블이 생성되었으므로 초기 마이그레이션을 가짜로 실행하면됩니다.

./manage.py migrate myapp --fake

모델의 스키마가 데이터베이스의 테이블 스키마와 동일한 지 확인하십시오.


답변

./manage.py migrate myapp –fake를 수행 한 후 “myapp_tablename”테이블에 이미 오류 중지가 발생하지만 DatabaseError는 myapp_mymodel.added_field 열을 표시하지 않습니다.

정확히 같은 문제가 발생했습니다!

1. 먼저이 문제를 일으키는 마이그레이션 번호확인하십시오 . 0010이라고 가정합니다.

2. 필요한 사항 :

./manage.py schemamigration myapp --add-field MyModel.added_field
./manage.py migrate myapp

둘 이상의 필드가 누락 된 경우 각 필드에 대해 반복해야합니다.

3. 이제 여러 가지 새로운 마이그레이션을 수행하므로 myapp / migrations에서 파일제거하십시오 (0011 이상으로 여러 필드를 추가 해야하는 경우).

4. 이것을 실행하십시오 :

./manage.py migrate myapp 0010

이제 ./manage.py 마이그레이션 myapp를 시도하십시오.

실패하지 않으면 준비가 된 것입니다. 누락 된 필드가 없는지 다시 확인하십시오.

편집하다:

South를 설치하는 프로덕션 데이터베이스가 있고 다른 환경에서 작성된 첫 번째 초기 마이그레이션이 이미 DB에있는 것과 동일한 경우이 문제가 발생할 수 있습니다. 해결책은 여기에서 훨씬 쉽습니다.

  1. 첫 번째 마이그레이션을 가짜 :

    ./manage migration myapp 0001-가짜

  2. 나머지 마이그레이션으로 롤 :

    ./manage 마이그레이션 myapp


답변

이 오류가 발생했을 때 다른 원인이있었습니다.

필자의 경우 South는 어떻게 든 _remake_table () 에서 사용되는 임시 빈 테이블을 DB에 남겨 두었습니다 . 아마도 내가하지 말아야 할 방식으로 이주를 중단했을 것입니다. 어쨌든 _remake_table ()을 호출 할 때 이후의 각 새 마이그레이션 이미 존재하고 존재 하지sqlite3.pypysqlite2.dbapi2.OperationalError: table "_south_new_myapp_mymodel" already exists 않았기 때문에 오류를 발생시킵니다 .

_south_new 비트가 나에게 이상해 보였으므로 DB를 탐색하고 테이블을 보았고 _south_new_myapp_mymodel머리를 긁 었고 South의 소스를 보았고 그것이 정크라고 판단하고 테이블을 삭제했으며 모든 것이 잘되었습니다.


답변

@pielgrzym과 같이 데이터베이스와 일치하지 않는 모델에 문제가 있고 최신 models.py 파일과 일치하도록 자동으로 데이터베이스를 마이그레이션하려는 경우 (및 동안 조명기에 의해 재생성되지 않는 모든 데이터를 지우십시오 migrate) :

manage.py schemamigration myapp --initial
manage.py migrate myapp --fake
manage.py migrate myapp zero
manage.py migrate myapp

이것은 단지 삭제하고 최신에 존재하는 재 작성 데이터베이스 테이블 것이다 models.py당신은 이전에서 데이터베이스에 쓰레기 테이블을 가질 수 있도록 파일 syncdbs 또는 migrateS. 이를 제거하려면 다음과 같이 모든 마이그레이션을 수행하십시오.

manage.py sqlclear myapp | manage.py sqlshell

그 여전히 데이터베이스에 주위에 거짓말을 일부 cruft에 나뭇잎 경우 그리고 당신은 작업을 수행해야 inspectdb하고, 생성 models.py을하기 전에 (테이블과 삭제하려는 것을 응용 프로그램에 대한) 그에서 파일을 sqlclear다음하기 전에 원래 models.py을 복원 --initial마이그레이션을 생성하고 마이그레이션합니다. 이 모든 것은 데이터베이스에 필요한 특정 종류의 SQL을 망칠 필요가 없습니다.


답변

Perform these steps in order may help you:

1) python manage.py schemamigration apps.appname-초기

위의 단계는 기본적으로 마이그레이션 폴더를 만듭니다.

2) python manage.py migrate apps.appname –fake

가짜 마이그레이션을 생성합니다.

3) python manage.py schemamigration apps.appname-자동

그런 다음 원하는대로 필드를 추가하고 위 명령을 수행 할 수 있습니다.

4) python manage.py 마이그레이션 apps.appname


답변

기존 데이터베이스 및 앱이있는 경우 남쪽 변환 명령을 사용할 수 있습니다

./manage.py convert_to_south myapp

데이터베이스에 이미있는 내용을 변경 하기 전에 적용 해야 합니다.

convert_to_south 명령은 처음 실행 한 시스템에서만 작동합니다. VCS 로의 초기 마이그레이션을 커밋 한 후에 ./manage.py migrate myapp 0001 --fake는 코드베이스의 사본이있는 모든 머신 에서 실행해야합니다 (모델 및 스키마가 최신인지 확인). 심판 : http://south.readthedocs.org/en/latest/convertinganapp.html


답변

임시 솔루션으로 마이그레이션 스크립트에서 테이블 작성에 주석을 달 수 있습니다.

class Migration(migrations.Migration):

    dependencies = [
        (...)
    ]

    operations = [
        #migrations.CreateModel(
        #    name='TABLE',
        #    fields=[
        #            ....
        #            ....
        #    ],
        #),
        ....
        ....

또는

기존 테이블에 행이 없으면 (빈) 다음과 같이 테이블을 삭제하십시오. (이 수정은 테이블에 행이없는 경우에만 권장됩니다) . 또한 createModel 조작 전에이 조작을 확인하십시오.

class Migration(migrations.Migration):

    dependencies = [
        (...),
    ]

    operations = [
        migrations.RunSQL("DROP TABLE myapp_tablename;")
    ]