2014-04-18 3 views
0

두 자식 클래스의 부모 인 Django 클래스를 마이그레이션하는 데 문제가 있습니다. 모든 수업은 동일한 앱에 있습니다. 부모 클래스를 마이그레이션하려고 할 때마다 South는 테이블이 이미 존재한다고 불평합니다.동일한 응용 프로그램에서 여러 자식 클래스가있는 부모 클래스의 남쪽 마이그레이션

class ParentClass(models.Model): 

    my_field_in_both = models.DateField(null=True, blank=True) 

    class Meta(): 
     abstract = True 

두 자식 클래스 : : 이제

class ChildOne(ParentClass, AnotherMixin): 
    child_field = models.DateField(null=True, blank=True) 

class ChildTwo(ParentClass, YetAnotherMixin): 
    another_child_field = models.DateField(null=True, blank=True) 

, 나는 AnotherMixin 또는 YetAnotherMixin 클래스 아무 문제 중 하나를 마이그레이션 할 수 있습니다 여기에 간단하게 내 클래스입니다. 그러나에 ParentClass에 필드를 추가 한 다음 실행 :

python manage.py schemeamigration <appname> --auto 

마이그레이션 파일을 생성하지만, 다음 실행 :

python manage.py migrate <appname> 

을 제공합니다

내가 잘못 뭐하는 거지
django.db.utils.DatabaseError: table "_south_new_<appname>_ChildTwo" already exists 

?

답변

0

테이블이 이미 있으므로 이미 존재한다고 말합니다. 과거 어느 시점에서 마이그레이션을 망친 것 같지만 걱정하지 마십시오! 누구나 어느 시점에서 그렇게합니다.

두 가지 경로가 있습니다. 하나가 실패하면, 당신은 여전히 ​​다른 것을 할 수 있습니다. 그래서 나는 그들을 시도 할 순서대로 나열하려고합니다. 쉽게 (그리고 잠재적으로 위험한 프로젝트와 얼마나 멀리 당신이 함께있는의 크기에 따라) 두의 가짜 마이그레이션 :

./manage.py migrate ChildTwo --fake 

제대로 모든 것을 한 척 것을 시도하지만, 경우에하는 것입니다 데이터베이스의 실제 구조 및 데이터베이스의 가짜 구조와 충돌이 발생하면 수동으로 문제를 해결해야합니다. 그러나 당신이 당신의 프로젝트에서 그리 멀지 않은 것처럼 들리므로, Im은 사지에 나가서 그렇게 큰 거래를하지 않을 것이라고 말합니다. 앱에서

  1. migrations/ 폴더 : 이들은 당신이 수동으로 삭제하려고하고있는 것들입니다. 데이터베이스

  2. 에서

  3. <app_name>_childtwo 테이블

  4. south_migrationshistory 테이블의 모든 행은 ChildTwo 모델에 해당. 당신이 MySQL을 사용하는 경우 : DELETE FROM <database name>.south_migrationhistory WHERE app_name ='<app_name>';

을하지만 단지 전체 응용 프로그램에 해당하는 모든 마이그레이션을 삭제하는 것이 더 쉬울 수 있습니다 다음에 시작 : 어떤 합리적인 사람처럼 ./manage.py schemamigration app_name --initial

, 나는 쓰기를 경멸 SQL이라면 phpmyadmin 인터페이스를 사용하는 것이 좋습니다.

곧 편집을 중단하겠습니다. 앱이 너무 멀지 않다면 ./manage.py reset <app_name>을 다시 시작하면됩니다. 남은 마이그레이션 폴더 및 db 항목을 제거해야합니다.