2014-04-09 114 views
0

在学习南方的过程中,我犯了一些我想要诵读的错误。这里是其中的一个: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 

很显然,我可以只运行第4和第2,并且如果他们出演3将不会被应用:

./migrate my_app 0004 

但作为步骤2和3是多余的并且不需要运行,是否可以简单地删除它们?另外,我要补充进出口担心有人可能只是运行迁移然后将删除该表(和任何数据),然后重新创建它...

由于提前,

+0

如果您运行'... migrate my_app 0004',那么您将应用迁移2,3和4. – Suor

回答

3

有两个方面的考虑在这里。

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

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

+0

感谢您的回答,但是您能否对此有点冗长? '使用./manage.py向后运行迁移2和3,迁移my_app 0001,然后删除迁移' - 我不确定您的意思。“ – rix

+0

命令'./manage.py migrate my_app '。不运行迁移'some-number'它运行迁移,直到应用了'some-number'的所有东西。示例1:您已将迁移最多包含到2,并运行'.... 0004' =>迁移3和4运行。示例2:相同的位置并运行'... 0001' =>迁移2向后运行。 – Suor

+0

当然,只要删除它们即可。这就是迁移的重点,能够随时回到迁移1! ./manage.py迁移0002 RM 迁移/ 0003 .... RM 迁移/ 0004 .... 完成。 –