我进行了迁移,添加了一个新表,并但愿还原该表并删除该迁移,而不建立新迁移。 python
我该怎么作? 是否有命令还原上一次迁移,而后我能够简单地删除迁移文件? 数据库
您能够经过迁移到上一个迁移来还原。 django
例如,若是您的最后两个迁移是: app
0010_previous_migration
0011_migration_to_revert
而后,您将执行如下操做: ide
./manage.py migrate my_app 0010_previous_migration
而后,您能够删除迁移0011_migration_to_revert
。 oop
若是您使用的是Django 1.8+,则可使用如下命令显示全部迁移的名称 post
./manage.py showmigrations my_app
要撤消应用程序的全部迁移,能够运行: spa
./manage.py migrate my_app zero
您能够作的另外一件事是删除手动建立的表。 code
除此以外,您还必须删除该特定的迁移文件。 一样,您将必须删除与该特定迁移相关的django-migrations表中的特定条目 (在您的状况下多是最后一个)。 utf-8
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
。 这些在功能上都是相同的。 (记入评论)
我这样作是在1.9.1(删除最后建立的或最新的迁移):
rm <appname>/migrations/<migration #>*
例如: rm myapp/migrations/0011*
登陆数据库并运行此SQL(在此示例中为postgres)
delete from django_migrations where name like '0011%';
而后,我可以建立新的迁移,该迁移以我刚刚删除的迁移号(在本例中为11)开头。
这是个人解决方案,由于当您使用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访问表。