我做了一个迁移,添加了一个新表,想要恢复它并删除迁移,而不创建一个新的迁移。
我该怎么做?是否有恢复上次迁移的命令,然后我可以简单地删除迁移文件?
我做了一个迁移,添加了一个新表,想要恢复它并删除迁移,而不创建一个新的迁移。
我该怎么做?是否有恢复上次迁移的命令,然后我可以简单地删除迁移文件?
当前回答
有一个很好的库可以使用它叫djagno-nomad,虽然没有直接关系到所问的问题,想分享这个,
场景:大多数情况下,当切换到项目时,我们觉得它应该恢复我们在当前分支上所做的更改,这正是这个库所做的,下面签出
https://pypi.org/project/django-nomad/
其他回答
Alasdair的回答涵盖了基本问题
通过./manage.py showmigrations确定您想要的迁移 使用应用程序名称和迁移名称进行迁移
但应该指出的是,并非所有的迁移都可以逆转。如果Django没有规则来执行反转,就会发生这种情况。对于通过./manage.py makemigrations自动进行迁移的大多数更改,反转是可能的。然而,自定义脚本将需要同时写正向和反向,如示例中所述:
https://docs.djangoproject.com/en/1.9/ref/migration-operations/
如何进行无操作逆转
如果您有一个RunPython操作,那么您可能只是想在不编写逻辑上严格的反转脚本的情况下退出迁移。下面对文档中的示例的快速修改(上面的链接)允许这样做,使数据库保持在应用迁移之后的相同状态,即使是在反转它之后。
# -*- coding: utf-8 -*-
from __future__ import unicode_literals
from django.db import migrations, models
def forwards_func(apps, schema_editor):
# We get the model from the versioned app registry;
# if we directly import it, it'll be the wrong version
Country = apps.get_model("myapp", "Country")
db_alias = schema_editor.connection.alias
Country.objects.using(db_alias).bulk_create([
Country(name="USA", code="us"),
Country(name="France", code="fr"),
])
class Migration(migrations.Migration):
dependencies = []
operations = [
migrations.RunPython(forwards_func, lambda apps, schema_editor: None),
]
这适用于Django 1.8、1.9
更新:更好的编写方法是将上面代码片段中的lambda apps, schema_editor: None替换为migrations.RunPython.noop。它们在功能上是一样的。(来源:评论)
您可以通过迁移到以前的迁移进行恢复。
例如,如果你的最后两次迁移是:
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
下面是我的解决方案,因为上面的解决方案并没有真正涵盖使用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访问表。
有一个很好的库可以使用它叫djagno-nomad,虽然没有直接关系到所问的问题,想分享这个,
场景:大多数情况下,当切换到项目时,我们觉得它应该恢复我们在当前分支上所做的更改,这正是这个库所做的,下面签出
https://pypi.org/project/django-nomad/
在恢复之前不要删除迁移文件。我犯了这个错误,没有迁移文件,数据库就不知道要删除什么东西。
python manage.py showmigrations
python manage.py migrate {app name from show migrations} {00##_migration file.py}
如果你想恢复所有的迁移,使用0作为迁移的名称:
python manage.py migrate app_name_here zero
删除迁移文件。一旦您的模型中有了所需的迁移……
python manage.py makemigrations
python manage.py migrate