【问题标题】:Backwards migration with Django South使用 Django South 向后迁移
【发布时间】:2011-08-14 10:12:57
【问题描述】:

好的,所以这似乎是一个非常愚蠢的问题,我确定我在某个地方遗漏了一些东西。

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

所以我调整了我的模型,使用schemamigration 创建了一个迁移,使用migrate 运行迁移,现在我意识到这并不是我想要的,我希望它回到以前的方式。

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

谁能帮忙?

【问题讨论】:

  • 好问题!!

标签: django migration django-south


【解决方案1】:

您需要弄清楚迁移的编号就在您要回滚的迁移之前

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

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。

【讨论】:

  • 不幸的是,当您创建下一个迁移时,它不会跳过中间的迁移,因此您稍后只需再次迁移它们。似乎有更好的方法。
  • @mlissner 如果你真的想要,在回滚数据库后,转到给定应用程序的迁移文件夹(在上面的示例中为 your_app/migrations)并删除不需要的迁移
  • 完全正确——South 从不跳过迁移;它期望来自 0001-nnnn 的文件代表一组一致的迁移,对于任何 nnnn 值。如果不是这种情况,那么您需要自己重新排序或删除有问题的。
【解决方案2】:

以防万一有人(比如我)想知道如何从初始 (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

【讨论】:

  • 有人运行了 migrate 0001 --fake,这是向后运行 0001 的唯一方法。谢谢!
  • 非常重要的答案,我想知道为什么migrate 0000 不起作用。关于假迁移,是的,你可能需要它,如果你例如只需要撤消(可能是错误的)初始迁移,但迁移历史认为,这种迁移从未发生过。
【解决方案3】:

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

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

【讨论】:

  • 没关系,我以前也这样做过,但是打字/粘贴很多。光秃秃的“状态”数字——在这种情况下是00xx——就足够了。在改进和测试迁移时,您可以在历史记录中使用这两个命令:前进(无参数),使用先前状态编号后退。
猜你喜欢
  • 2012-08-06
  • 2012-08-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-07-27
  • 2012-04-11
  • 1970-01-01
相关资源
最近更新 更多