Django south,删除特定迁移

问题描述 投票:0回答:2

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

# 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

很明显,我可以只运行第 4 步,如果已加星标,则不会应用第 2 步和第 3 步:

./migrate my_app 0004

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

提前致谢,

django django-south
2个回答
6
投票

这里有两个考虑因素。

首先,如果您已经运行了迁移,那么它会记录在数据库中,如果您只是删除一个文件,那么您将遇到问题:您的数据库将引用不存在的迁移。有一个解决方案:使用

./manage.py migrate my_app 0001
向后运行迁移 2 和 3,然后删除迁移文件。如果您无法迁移回来(例如,您手动弄乱了数据库),那么您可以使用
./manage.py migrate my_app 0001 --fake
假迁移并设置数据库,因为它应该是手动的。假的意味着不会进行模式更改,但将删除迁移运行的注释。

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


0
投票

是的,这是可能的,但不推荐。

步骤01:

取消应用所有迁移:

python3 manage.py migrate users zero --fake

步骤02: 从表 django_migrations 中删除特定的迁移记录。

步骤03:

从 app/migrations 目录中删除实际的迁移文件。

步骤04: 打开下一个迁移,将依赖项引用到上一个迁移。它更像是一个链表,你想从中间删除一个节点。

Previous > Current (migration to be delete) > Next

完成!

© www.soinside.com 2019 - 2024. All rights reserved.