2011-04-28 94 views
209

好的,所以这似乎是一个非常愚蠢的问题,我敢肯定我在某处丢失了某些东西。Django South向后迁移

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

所以我调整了我的模型,创建了schemamigration的迁移,使用migrate运行迁移,现在我意识到这不是我想要的,我希望它恢复原样。

缺少手动编辑数据库表和删除迁移文件,我应该如何回滚迁移回来?我通过谷歌找到了使用南方的向后迁移参考,但尚未找到一个可靠的代码示例。

任何人都可以帮忙吗?

+0

好问题! – 2017-03-05 09:30:49

回答

328

你只需要要回滚一个前要弄清楚迁移的数量。

您的应用程序应该有一个迁移目录,在它的文件命名为喜欢

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将迁移您的数据库,向前或向后迁移,以使其达到该点。因此,与上面的例子中的文件,如果您已经迁移了到0003,而你想反向运行0003(撤消,从而有效),你可以运行

./manage.py migrate your_app 0002 

南会看看数据库,实现它已经运行了0003,并确定它必须运行0003的反向迁移才能返回到0002.

+1

不幸的是,当你创建你的下一次迁移时,它不会跳过这两者之间的迁移,所以你稍后再次迁移它们。似乎可能有更好的方法。 – mlissner 2011-07-02 19:51:58

+44

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

+1

正确 - 南从不跳过迁移;它期望来自0001-nnnn的文件代表一组一致的迁移,对于任何nnnn值。如果情况并非如此,那么您需要自行重新订购或删除违规产品。 – 2011-08-19 15:13:38

3

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

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

没关系,我以前做过,但是很多打字/粘贴。裸露的“状态”号码(在本例中为“00xx”)就足够了。在改进和测试迁移时,您可以在历史记录中使用这两个命令:向前(无参数),向后与之前的状态编号。 – 2013-02-01 09:14:34

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 - 变成了,这是反向运行0001的唯一方法。谢谢! – jmanning2k 2012-07-06 22:12:40

+0

非常重要的答案,我想知道为什么'迁移0000'不起作用。关于假移民,是的,你可能需要它,如果你只需撤消(可能是错误的)初始迁移,但迁移历史认为,此迁移从未发生过。 – 2014-01-16 16:01:58

+0

Tomaszu,'migrate 0000'只是运行前缀为“0000”的迁移方便捷径。既然你没有这样的标准,它找不到它。 无论如何,我不知道为什么开发者决定这样直观的名称。 编辑:哦,我可以看到下面你知道前缀;] – 2014-01-26 21:10:44