与Django South向后迁移

Rui*_*wen 216 migration django django-south

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

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

所以我已经调整了我的模型,创建了一个迁移schemamigration,运行迁移migrate,现在我意识到这不是我想要的,我想要它回到以前的方式.

如果没有手动编辑数据库表并删除迁移文件,我应该如何进行迁移?我发现使用South通过谷歌进行向后迁移的参考,但还没有找到一个可靠的代码示例.

有人可以帮忙吗?

Ian*_*and 335

您需要要回滚的数据之前计算出迁移的数量.

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

0000_initial.py
0001_added_some_fields.py
0002_added_some_more_fields.py
0003_deleted_some_stuff.py
Run Code Online (Sandbox Code Playgroud)

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

但是,您也可以按编号指定任何迁移,South将向前或向后迁移数据库以使其达到该点.因此,使用上面的示例文件,如果您已经迁移到0003,并且您想要反向运行0003(有效地撤消它),那么您将运行

./manage.py migrate your_app 0002
Run Code Online (Sandbox Code Playgroud)

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

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

Ctr*_*l-C 217

以防有人(像我一样)想知道如何从初始(0001)迁回:

django-admin.py migrate some_app zero
Run Code Online (Sandbox Code Playgroud)

输出:

Running migrations for some_app:
 - Migrating backwards to zero state.
 < some_app:0001_initial
Run Code Online (Sandbox Code Playgroud)

"零"是任何迁移之前的特殊状态.

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

  • 有人跑了0001 --fake,这是向后运行0001的唯一方法.谢谢! (6认同)