django恢复上次迁移

Ron*_*ess 394 django django-migrations

我已经进行了迁移,添加了一个新表,并希望还原它并删除迁移,而不创建新的迁移.

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

Ala*_*air 717

您可以通过迁移到先前的迁移来恢复.

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

  • 0010_previous_migration
  • 0011_migration_to_revert

然后你会做:

./manage.py migrate my_app 0010_previous_migration 
Run Code Online (Sandbox Code Playgroud)

然后,您可以删除迁移0011_migration_to_revert.

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

./manage.py showmigrations my_app
Run Code Online (Sandbox Code Playgroud)

要撤消应用的所有迁移,您可以运行:

./manage.py migrate my_app zero
Run Code Online (Sandbox Code Playgroud)

  • [`migrate`](https://docs.djangoproject.com/en/1.10/ref/django-admin/#migrate)命令让你使用`.manage.py migrate my_app zero`来取消应用所有的迁移应用程序. (28认同)
  • 我已经看到很多关于这个问题的答案,这个问题已经过时了,根本不再适用.+1因为这适用于Django 1.8. (7认同)
  • 出于某种原因,./ manage.py迁移my_app 0010_previous_migration对我不起作用.所以我尝试使用./manage.py迁移my_app 0010并且它有效.Django 1.8不会采用整个迁移名称的任何原因? (4认同)
  • 只要您使用的是实际的迁移名称,而不是"0010_previous_migration",我就不知道为什么会看到这种行为. (4认同)
  • 如果应用程序只有一个迁移文件/初始迁移.我需要撤消初始迁移? (2认同)
  • @Ness 这只是“去迁移”。如果您不想再进行迁移,则还需要删除迁移文件。 (2认同)
  • 使用django 2.1,这对我有用:`/manage.py migration my_app 0010`,只有`0010`,而不是完整的文件名。之后,手动删除本地文件appname / migrations / 0011 +,然后从django_migrations db表中手动删除0011+的行。 (2认同)

Dan*_*ick 31

在还原之前不要删除迁移文件。我犯了这个错误,没有迁移文件,数据库不知道要删除哪些内容。

python manage.py showmigrations
python manage.py migrate {app name from show migrations} {00##_migration file.py}
Run Code Online (Sandbox Code Playgroud)

如果要还原所有迁移,请zero用作迁移的名称:

python manage.py migrate app_name_here zero
Run Code Online (Sandbox Code Playgroud)

删除迁移文件。一旦所需的迁移在您的模型中...

python manage.py makemigrations
python manage.py migrate
Run Code Online (Sandbox Code Playgroud)


Ala*_*nSE 30

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),
    ]
Run Code Online (Sandbox Code Playgroud)

这适用于Django 1.8,1.9


更新:写这将是更换更好的办法lambda apps, schema_editor: Nonemigrations.RunPython.noop在上面的代码片段.这些在功能上都是一样的.(信用评论)

  • 从Django 1.8开始,您应该使用`RunPython.noop`而不是内联lambda或equivelent:https://docs.djangoproject.com/en/1.8/ref/migration-operations/#django.db.migrations.operations. RunPython.noop (4认同)

Rad*_*deh 12

要恢复迁移:

python manage.py migrate <APP_NAME> <MIGRATION_NUMBER_PREFIX>
Run Code Online (Sandbox Code Playgroud)

MIGRATION_NUMBER_PREFIX是您要恢复到的迁移的编号前缀,例如0001转到0001_initial.py迁移。然后您可以删除该迁移。

您可以将其zero用作迁移编号来还原应用程序的所有迁移。


Alb*_*ing 11

首先:找到您的应用程序以前的迁移,

python manage.py showmigrations

例如:

bz
 [X] 0001_initial
 [ ] 0002_bazifff


Run Code Online (Sandbox Code Playgroud)

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

python manage.py migrate bz 0001_initial
Run Code Online (Sandbox Code Playgroud)

如果你想回滚0001_initial全部

python manage.py migrate bz zero
Run Code Online (Sandbox Code Playgroud)

好像只能回滚0001


spr*_*ksh 9

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

除此之外,您还必须删除该特定的迁移文件.此外,您必须删除django-migrations表中的特定条目(可能是您的案例中的最后一个条目),该条目与该特定迁移相关.

  • 我会非常小心地添加.你可以在Postgres中打破很多东西,比如约束. (4认同)

Öze*_* S. 9

这是我的解决方案,因为上述解决方案在您使用时并未真正涵盖用例RunPython.

您可以通过ORM访问该表

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})
Run Code Online (Sandbox Code Playgroud)

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


Ehs*_*dar 8

您可以通过迁移到之前的迁移来恢复。

例如使用下面的命令:

./manage.py migrate example_app one_left_to_the_last_migration
Run Code Online (Sandbox Code Playgroud)

然后删除last_migration文件。


Pra*_*ari 6

如果您在恢复迁移时遇到问题,并且不知何故弄乱了它,您可以执行fake迁移。

./manage.py migrate <name> --ignore-ghost-migrations --merge --fake
Run Code Online (Sandbox Code Playgroud)

对于Django < 1.7 版本,这将在south_migrationhistory表中创建条目,您需要删除该条目。

现在,您将能够轻松恢复迁移。

PS:我被困了很长时间,执行假迁移然后恢复帮助了我。

  • 这个答案适用于 Django &lt; 1.7。 (2认同)

MIk*_*kee 5

我在1.9.1中做了这个(删除创建的最后一个或最新的迁移):

  1. rm <appname>/migrations/<migration #>*

    例: rm myapp/migrations/0011*

  2. 登录到数据库并运行此SQL(在此示例中为postgres)

    delete from django_migrations where name like '0011%';

然后我能够创建以我刚刚删除的迁移号码开始的新迁移(在本例中为11).

  • +1 虽然这可行,但你需要保存这种方式作为最后的手段。此外,您还必须记住编辑/删除有问题的迁移造成的列/表。 (2认同)