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

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


当前回答

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

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

其他回答

恢复迁移。

python manage.py migrate <APP_NAME> <MIGRATION_NUMBER_PREFIX>

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

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

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

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

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。它们在功能上是一样的。(来源:评论)

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

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

所有其他答案都非常适合回滚线性迁移。然而,当迁移是非线性的,即有多个叶节点,我们希望只回滚一条路径,那么我们可以这样做:

    X
  /   \
 A      B      [A and B can represent any number of linear migrations.] 
  \   /
    Y (merge migration)

如果我们需要回滚A,B和y,那么我们可以用其他答案状态的方式来做。 即python manage.py迁移应用X。

如果只需要取消回滚B和回滚Y,请执行以下步骤:

通过执行python manage.py迁移应用程序B(或A;这两个作品)。 暂时从项目位置移除迁移文件A和Y。 现在取消应用B,执行python manage.py迁移应用X。

将迁移文件A和Y带到原始位置。现在,如果您愿意,您可以安全地删除未应用的迁移B和Y。

要点是django只能回滚迁移,如果文件在位置中。如果您不想回滚一个迁移路径(例如这里的a),请在执行回滚时将其从项目位置中移除。

更多关于这个。https://stackoverflow.com/a/71231925/8663277