让我感到困惑。让我们假设我们有一个南方迁移的Django项目。目前,生产项目版本为A
,正在开发中的版本B
。现在让我们假设版本B
已安装到生产中:
./manage.py syncdb && ./manage.py migrate
下一个假设:版本B
根本不起作用。它确实在开发中,但不在生产中,因此必须回滚。这是我必须遗漏的地方。我看到两种可能性:
A
的最新版本?由于一个项目可以很容易地计算几十个应用程序,因此您需要弄清楚哪个迁移站属于旧版本,然后单独迁移每个应用程序,然后回滚代码并希望最好。在这两种情况下,我都缺少重要信息,第一种情况下的迁移代码或第二种情况下的“迁移<->
版本”关系。我在这里缺少什么?
PS :是的,我知道我可以从备份恢复数据库,这就是我实际做的。我想知道整个数据库迁移理论如何适应回滚。
答案 0 :(得分:4)
行。我认为你正在使用版本控制?在这一点上,确定'A'和'B'的组成部分至关重要。如果我们正在挥手/猜测我们引用的这个代表性的代码是'A',而另一个模糊定义的东西我们都标记为'B' - 它不会起作用。
如果您尝试在'B'处重新安装'A',您有两种选择: 1)签出并从头开始重建'A'(同步和迁移) 2)将'B'回滚到'A'。
1)可能无法正常工作,因为你无法负担杀死数据库中的数据以便从零开始同步它
2)涉及迁移。首先,您应该在“B”而不是“A”中找到迁移。在南方,每个应用程序的所有迁移都编号(0001,0002,0003等)。因此,假设'B'为050,'A'为0031.当您'B'签出时,运行python manage.py migrate appname 0031
这将撤消您为'B'所做的所有数据库更改。然后在您的版本控制系统中,签出'A'(无论'A'只是提交,标签还是分支)
不幸的是,你不能回滚到'A',然后说“不迁移你没有的所有东西”。这将是一个更简单的解决方案 - 但是你需要迁移系统来了解你的版本控制系统,这有点毛茸茸。
答案 1 :(得分:1)
不确定这是否是您的情况下的选项,但是在将代码移回版本'A'之前,您是否无法在生产中运行向后迁移?通过这种方式,您的数据库会在您执行syncdb之前返回到那里的任何迁移,然后您将代码更改回版本A,然后您就可以回到开始的位置。