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


188

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을 실행 중입니다.

답변:


311

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

./manage.py migrate myapp --fake

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


1
감사합니다 실제로는 스키마 마이그레이션이 아니라 마이그레이션이지만 귀하의 답변이 올바른 방향으로 나아갔습니다.
Steve

1
내 실수는 방금 OP에서 명령을 복사했습니다. 올바른 명령 ./manage.py migrate myapp --fake
Ashok

이 솔루션은 필자의 경우 문제를 해결하지 못했습니다. 필드가 테이블에서 작성되지 않았기 때문에 데이터베이스를 수정하지 않고 일부보기가 충돌했습니다. 나는 새로운 재산에 대해 언급하고, 모든 것을 다시 설정하기 위해 가짜로 다시 이주했으며, 두 번째로 시도했을 때 여전히 이해가 안되었지만 ... :)
Mc-

1
@Ashok 어쩌면 당신은 또한 우리가 다시 실행해야 지정해야합니다 schemamigration전과 migrate경우에 우리는 이미 지난 전에 수정을했다 schemamigration.
Pierre de LESPINAY

3
이것은 나를 도와주지 않았다. 데이터베이스에 이미 테이블이 있었고 마이그레이션을 마친 후 가짜 테이블을 추가 할 방법이 없었습니다. 나는 모든 테이블을 버리고 새로 시작해야했습니다.
Shailen

41

./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


10

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

필자의 경우 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의 소스를 보았고 그것이 정크라고 판단하고 테이블을 삭제했으며 모든 것이 잘되었습니다.


이것이 내가보고, 이것을 찾은 것인데, 반 시간의 두통을 구했을 것입니다. 매우 불쾌합니다. 그러나 이들은 임시 마이그레이션 테이블이며 마이그레이션이 실패하는 동안 검사 목적으로 남아 있습니다. 마이그레이션 시도 중 일부 DB 무결성 문제로 인해 광산이 발생했습니다.
Danny Staple

이것은 더 높아야합니다! 스키마 트랜잭션없이 db를 사용하는 경우 이것은 아주 쉽게 발생할 수 있습니다.
Yuji 'Tomita'Tomita

2

@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을 망칠 필요가 없습니다.


1

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


1

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

./manage.py convert_to_south myapp

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

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


0

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

class Migration(migrations.Migration):

    dependencies = [
        (...)
    ]

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

또는

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

class Migration(migrations.Migration):

    dependencies = [
        (...),
    ]

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

0

하나의 해결책 (일시적인 해결책 일 수도 있음).

$ python manage.py sqlmigrate APP_NAME MIGRATION_NAME

예를 들어.

$ python manage.py sqlmigrate users 0029_auto_20170310_1117

원시 SQL 쿼리의 모든 마이그레이션이 나열됩니다. 기존 테이블을 생성하는 부분을 피하면서 실행하려는 쿼리를 선택할 수 있습니다.

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