如何恢复上一次迁移?
如何恢复上一次迁移?
我进行了迁移,新增了一个表,现在想回滚并删除这个迁移,而不需要创建一个新的迁移文件。我应该如何操作?是否有一条命令可以回滚上一个迁移,然后我可以简单地删除迁移文件呢?
admin 更改状态以发布 2023年5月21日
Alasdair的回答涵盖了基础知识
- 通过
./manage.py showmigrations
识别你想要的迁移 - 使用应用程序名称和迁移名称进行
migrate
但是应该指出的是,不是所有迁移都可以被反转。如果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