我進行了遷移,添加了一個新表,並但願還原該表並刪除該遷移,而不建立新遷移。 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訪問表。