我做了一个迁移,添加了一个新表,想要恢复它并删除迁移,而不创建一个新的迁移。

我该怎么做?是否有恢复上次迁移的命令,然后我可以简单地删除迁移文件?


当前回答

恢复迁移。

python manage.py migrate <APP_NAME> <MIGRATION_NUMBER_PREFIX>

MIGRATION_NUMBER_PREFIX是您要还原到的迁移的数字前缀,例如0001表示转到0001_initial.py迁移。然后您可以删除该迁移。

您可以使用0作为迁移号来恢复应用程序的所有迁移。

其他回答

您可以通过迁移到以前的迁移进行恢复。

例如,如果你的最后两次迁移是:

0010年_previous_migration 0011年_migration_to_revert

然后你会这样做:

./manage.py migrate my_app 0010_previous_migration 

您实际上不需要使用完整的迁移名称,数量就足够了,即。

./manage.py migrate my_app 0010 

然后可以删除迁移0011_migration_to_revert。

如果你使用的是Django 1.8+,你可以显示所有迁移的名称

./manage.py showmigrations my_app

要反转应用程序的所有迁移,你可以运行:

./manage.py migrate my_app zero

您可以做的另一件事是删除手动创建的表。

与此同时,您还必须删除特定的迁移文件。同时,你必须删除django-migrations表中与特定迁移相关的特定条目(可能是你的情况下的最后一个)。

下面是我的解决方案,因为上面的解决方案并没有真正涵盖使用RunPython时的用例。

可以通过ORM with访问该表

from django.db.migrations.recorder import MigrationRecorder

>>> MigrationRecorder.Migration.objects.all()
>>> MigrationRecorder.Migration.objects.latest('id')
Out[5]: <Migration: Migration 0050_auto_20170603_1814 for model>
>>> MigrationRecorder.Migration.objects.latest('id').delete()
Out[4]: (1, {u'migrations.Migration': 1})

因此,您可以查询这些表并删除与您相关的条目。这样您就可以详细地进行修改。使用RynPython迁移,您还需要处理添加/更改/删除的数据。上面的例子只显示了如何通过Djang ORM访问表。

首先:找到你的应用程序之前的迁移,

Python manage.py showmigrations

eg:

bz
 [X] 0001_initial
 [ ] 0002_bazifff


如果您想要回滚0002_baziff迁移,

python manage.py migrate bz 0001_initial

如果要回滚0001_initial或all

python manage.py migrate bz zero

似乎只能回退0001

有一个很好的库可以使用它叫djagno-nomad,虽然没有直接关系到所问的问题,想分享这个,

场景:大多数情况下,当切换到项目时,我们觉得它应该恢复我们在当前分支上所做的更改,这正是这个库所做的,下面签出

https://pypi.org/project/django-nomad/