如何恢复上一次迁移?

13 浏览
0 Comments

如何恢复上一次迁移?

我进行了迁移,新增了一个表,现在想回滚并删除这个迁移,而不需要创建一个新的迁移文件。我应该如何操作?是否有一条命令可以回滚上一个迁移,然后我可以简单地删除迁移文件呢?

admin 更改状态以发布 2023年5月21日
0
0 Comments

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。它们的功能是相同的。 (感谢评论)

0
0 Comments

您可以通过迁移到之前的迁移来还原。

例如,如果您的最后两个迁移是:

  • 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

0