使用Django South向后迁移


217

好的,这似乎是一个很愚蠢的问题,而且我确定我在某处缺少了一些东西。

如何在Django上使用South执行向后迁移?

因此,我调整了模型,使用进行了迁移schemamigration,使用进行了迁移migrate,现在我意识到这并不是我想要的,并且我想回到以前的样子。

除了手动编辑数据库表和删除迁移文件之外,我应该如何回滚迁移?我找到了通过Google通过South使用向后迁移的参考,但尚未找到可靠的代码示例。

有人可以帮忙吗?


好问题!!
马歇尔X

Answers:


335

您需要要回滚的迁移之前弄清楚迁移的数量。

您的应用程序应该有一个迁移目录,其中的文件名为

0000_initial.py
0001_added_some_fields.py
0002_added_some_more_fields.py
0003_deleted_some_stuff.py

通常,在运行时./manage.py migrate your_app,South会按顺序运行所有新迁移。(它查看数据库表以确定哪些是“新的”)。

但是,您也可以按数字指定任何迁移,South会向前或向后迁移数据库,以达到此目的。因此,在上面的示例文件中,如果您已经迁移到0003,并且想要反向运行0003(有效地撤消它),则可以运行

./manage.py migrate your_app 0002

South将查看数据库,意识到它已经运行了0003,并确定它必须对0003运行反向迁移才能返回到0002。


1
不幸的是,当您创建下一个迁移时,它不会跳过它们之间的迁移,因此您稍后可以再次迁移它们。似乎有更好的方法。
mlissner

44
@mlissner如果您确实想要回滚数据库之后,请转到给定应用程序的migrations文件夹(在上面的示例your_app / migrations中)并删除不需要的迁移
Josh Russo

1
确实-南方从不逃避移民;对于任何nnnn值,它都希望0001-nnnn中的文件表示一组一致的迁移。如果不是这种情况,那么您需要自己重新排序或删除有问题的。
伊恩·克莱兰

217

以防万一(像我一样)想知道如何从初始(0001)迁移回去

django-admin.py migrate some_app zero

输出:

Running migrations for some_app:
 - Migrating backwards to zero state.
 < some_app:0001_initial

“零”是任何迁移之前的特殊状态。

参考:http//south.aeracode.org/docs/commands.html


6
有人将0001 --fake迁移了,这是向后运行0001的唯一方法。谢谢!
jmanning2k 2012年

1
非常重要的答案,我想知道为什么migrate 0000不起作用。关于假迁移,是的,如果您仅需要撤消(可能是错误的)初始迁移,则可能需要它,但是迁移历史认为该迁移从未发生。
Tomasz Gandor 2014年

3

在参数末尾添加迁移名称:

./manage.py migrate app-name 00xx-migration-name

2
没关系,我之前做过,但是很多输入/粘贴操作。在这种情况下00xx,仅使用“状态”数字即可。在改进和测试迁移时,您可以在历史记录中同时使用这两个命令:正向(无自变量),向后带有先前的状态号。
Tomasz Gandor
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.