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訪問表。

相關文章
相關標籤/搜索