重置南方的迁移会导致“表已存在”

时间:2014-04-17 19:29:02

标签: django django-south

好的,这让我疯了。我正在尝试删除和重置我的DEV环境中的所有南迁移以获取两个应用程序,然后重新开始使用干净的平板,因为我的迁移文件列表变得非常长并且我不需要它们,因为模型是不断的改变,它只是DEV。无论我怎样尝试,南方都经常抱怨数据库表已经存在。

在SO上继续this回答,我首先完全从每个应用中移除我的迁移目录:

rm -r <my-app>/migrations

没问题。然后重置南表:

python manage.py reset south

再一次,不用担心。

现在告诉南方,我希望管理这些应用:

python manage.py convert_to_south <appname>

一切似乎都很好,它甚至创建了初始迁移并运行--fake:

Created 0001_initial.py. You can now apply this migration with: ./manage.py migrate CC
- Soft matched migration 0001 to 0001_initial.
Running migrations for CC:
- Migrating forwards to 0001_initial.
> CC:0001_initial
(faked)

好的,所以根据我的(不正确的)理解,我现在让我现有的表由南方管理。 South知道表格ALREADY存在,因为我们最初的运行是--fake。

现在我向模型添加一个新字段,运行schemamigration然后在该新模式上进行迁移,并猜测是什么,South抱怨这些表已经存在。

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

到底是什么?我究竟做错了什么?

3 个答案:

答案 0 :(得分:1)

警告:在这里已经很晚了,我已经累了,但这将是这样的:

您可以假冒零件应用程序,删除迁移并为每个应用程序创建一个新的初始应用程序并伪造应用程序,而不是告诉South您要迁移现有应用程序(这意味着存在架构)。这基本上是南方用每个应用程序替换多个迁移

$ ./manage.py dumpdata myapp1 myapp2 > dumped.json  # just in case!
$ ./manage.py migrate myapp1 zero --fake
$ ./manage.py migrate myapp2 zero --fake
$ rm /path/to/myapp1/migrations/.py*
$ rm /path/to/myapp2/migrations/.py*
$ ./manage.py schemamigration myapp1 --initial
$ ./manage.py schemamigration myapp2 --initial
$ ./manage.py migrate myapp1 --fake 
$ ./manage.py migrate myapp2 --fake 

myapp1和myapp2的新0001迁移与实际创建现有模式的多个迁移具有相同的结果,因此一切都很合适(只要没有自定义SQL迁移等)

答案 1 :(得分:0)

试试这段代码:

rm <app>/migrations/*
python manage.py schemamigration <app> --initial
python manage.py migrate <app> 0001 --fake  --delete-ghost-migrations

答案 2 :(得分:0)

感谢所有贡献者 - 事实证明,当我在开发中使用SQlite时,正是这导致了所有问题。有关说明,请参阅有关SO的another问题。在这里回答我自己的问题,因为它可能对其他人有用 - 我正在切换到mySQL,因为上面提到的问题在我使用mySQL的PRD env中不存在。迁移都可以无缝地进行。