Django South实现反向迁移

220

好的,这似乎是一个非常愚蠢的问题,我肯定错过了某个地方。

如何在Django上使用South执行回滚迁移?

所以,我已经调整了我的模型,用 schemamigration 创建了一个迁移,用 migrate 运行了迁移,现在我意识到那不是我想要的,我想让它恢复到之前的状态。

除了手动编辑数据库表并删除迁移文件外,我该如何回滚迁移?我通过谷歌找到了使用South进行回滚迁移的参考资料,但尚未找到一个完整的代码示例。

有人能帮忙吗?


好问题!! - Marshall X
3个回答

335

你需要确定想要回滚的迁移之前的迁移编号。

你的应用程序应该有一个名为“migrations”的目录,其中包含类似下面命名的文件:

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
如果你真的想这样做,可以在回滚数据库后,进入给定应用程序的迁移文件夹(在上面的示例中是your_app/migrations),然后删除不需要的迁移文件。 - Josh Russo
1
准确地说--South 永远不会跳过迁移;它期望从 0001-nnnn 文件开始的每一组迁移,都是一致的。如果不是这种情况,您需要自己重新排序或删除有问题的文件。 - Ian Clelland

219

以防有人(就像我一样)想知道如何从初始状态(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
1
非常重要的答案,我想知道为什么migrate 0000无法工作。 关于虚假迁移,是的,如果您需要仅撤消(可能错误的)初始迁移,但迁移历史记录认为从未发生过此迁移,则可能需要它。 - Tomasz Gandor

3
在参数的末尾添加迁移名称:
./manage.py migrate app-name 00xx-migration-name

2
没问题,我以前做过这个,但是需要大量的打字/粘贴。裸的“状态”数字 - 在这种情况下是 00xx - 就足够了。在改进和测试迁移时,您可以在历史记录中拥有两个命令:向前(无参数),向后使用先前的状态编号。 - Tomasz Gandor

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接