好的,这似乎是一个非常愚蠢的问题,我肯定错过了某个地方。
如何在Django上使用South执行回滚迁移?
所以,我已经调整了我的模型,用 schemamigration
创建了一个迁移,用 migrate
运行了迁移,现在我意识到那不是我想要的,我想让它恢复到之前的状态。
除了手动编辑数据库表并删除迁移文件外,我该如何回滚迁移?我通过谷歌找到了使用South进行回滚迁移的参考资料,但尚未找到一个完整的代码示例。
有人能帮忙吗?
好的,这似乎是一个非常愚蠢的问题,我肯定错过了某个地方。
如何在Django上使用South执行回滚迁移?
所以,我已经调整了我的模型,用 schemamigration
创建了一个迁移,用 migrate
运行了迁移,现在我意识到那不是我想要的,我想让它恢复到之前的状态。
除了手动编辑数据库表并删除迁移文件外,我该如何回滚迁移?我通过谷歌找到了使用South进行回滚迁移的参考资料,但尚未找到一个完整的代码示例。
有人能帮忙吗?
你需要确定想要回滚的迁移之前的迁移编号。
你的应用程序应该有一个名为“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。
以防有人(就像我一样)想知道如何从初始状态(0001)迁回:
django-admin.py migrate some_app zero
输出:
Running migrations for some_app:
- Migrating backwards to zero state.
< some_app:0001_initial
“零”是任何迁移之前的特殊状态。
migrate 0000
无法工作。 关于虚假迁移,是的,如果您需要仅撤消(可能错误的)初始迁移,但迁移历史记录认为从未发生过此迁移,则可能需要它。 - Tomasz Gandor./manage.py migrate app-name 00xx-migration-name
00xx
- 就足够了。在改进和测试迁移时,您可以在历史记录中拥有两个命令:向前(无参数),向后使用先前的状态编号。 - Tomasz Gandor