django恢复上一次迁移

我进行了迁移,添加了一个新表,并但愿还原该表并删除该迁移,而不建立新迁移。 python

我该怎么作? 是否有命令还原上一次迁移,而后我能够简单地删除迁移文件? 数据库


#1楼

您能够经过迁移到上一个迁移来还原。 django

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

  • 0010_previous_migration
  • 0011_migration_to_revert

而后,您将执行如下操做: ide

./manage.py migrate my_app 0010_previous_migration

而后,您能够删除迁移0011_migration_to_revertoop

若是您使用的是Django 1.8+,则可使用如下命令显示全部迁移的名称 post

./manage.py showmigrations my_app

要撤消应用程序的全部迁移,能够运行: spa

./manage.py migrate my_app zero

#2楼

您能够作的另外一件事是删除手动建立的表。 code

除此以外,您还必须删除该特定的迁移文件。 一样,您将必须删除与该特定迁移相关的django-migrations表中的特定条目 (在您的状况下多是最后一个)。 utf-8


#3楼

Alasdair的答案涵盖了基础知识

  • 经过./manage.py showmigrations识别所需的迁移
  • migrate使用的应用程序名称和迁移名

可是应该指出,并不是全部迁移能够逆转。 若是Django没有规则进行逆转,则会发生这种状况。 对于经过./manage.py makemigrations自动进行迁移的大多数更改,均可以./manage.py makemigrations 。 可是,自定义脚本将须要同时编写正向和反向脚本,如此处的示例所述:

https://docs.djangoproject.com/zh-CN/1.9/ref/migration-operations/

如何进行无操做反转

若是您有RunPython操做,那么也许您只想在不编写逻辑上严格的反向脚本的状况下取消迁移。 如下来自docs(上面的连接)示例的快速修改容许这样作,使数据库处于与应用迁移后相同的状态,即便反向也是如此。

# -*- 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.八、1.9


更新:编写此代码的更好方法是用上面的代码片断中的migrations.RunPython.noop替换lambda apps, schema_editor: None 。 这些在功能上都是相同的。 (记入评论)


#4楼

我这样作是在1.9.1(删除最后建立的或最新的迁移):

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

    例如: rm myapp/migrations/0011*

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

    delete from django_migrations where name like '0011%';

而后,我可以建立新的迁移,该迁移以我刚刚删除的迁移号(在本例中为11)开头。


#5楼

这是个人解决方案,由于当您使用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})

所以,您能够查询表并删除与您相关的条目。 这样您能够详细修改。 使用RynPython迁移时,您还须要处理添加/更改/删除的数据。 上面的示例仅显示如何经过Djang ORM访问表。

相关文章
相关标签/搜索