Django 南,删除特定迁移

rix*_*rix 0 django django-south

在学习南方的过程中,我犯了一些错误,我想重申一下。这是其中之一:

# migrate --list
(*) 0002_auto__add_lesson #add the table
(*) 0003_auto__del_lesson #dammit, table uses wrong db engine so delete it
(*) 0004_auto__add_lesson #recreate the table
Run Code Online (Sandbox Code Playgroud)

显然,我可以只运行第 4 步,如果它们被加星标,则不会应用第 2 步和第 3 步:

./migrate my_app 0004
Run Code Online (Sandbox Code Playgroud)

但是由于第2步和第3步是多余的,不需要运行,是否可以简单地删除它们?另外,我应该补充一点,我担心有人可能会运行 migrate ,然后会删除表(和任何数据),然后重新创建它...

提前致谢,

Suo*_*uor 5

这里有两个考虑。

首先,如果您已经运行了迁移,那么它会记录在数据库中,如果您只是删除一个文件,那么您会遇到问题:您的数据库将引用不存在的迁移。有一个解决方案:使用 向后运行迁移 2 和 3 ./manage.py migrate my_app 0001,然后删除迁移文件。如果您无法回迁(例如您手动弄乱了您的数据库),那么您可以伪造回迁./manage.py migrate my_app 0001 --fake并设置数据库,因为它应该手动进行。假意味着不会更改架构,但将删除迁移运行的注释。

其次,您推送了代码,而其他人已经运行了您的迁移。在这种情况下,您需要创建一个新的迁移来恢复您对 2 和 3 所做的任何事情。这样任何人都可以通过运行您的新迁移来恢复不需要的更改。