2015-02-08 82 views
10

我想知道什麼是使用Django遷移刪除應用程序的所有表的最簡單方法。例如,如果我安裝了一個新軟件包,我將該應用程序添加到我的settings.py中,然後執行manage.py makemigrations和manage.py遷移;當我決定我不想使用這個軟件包,並將其從我的settings.py中刪除時,命令manage.py makemigrations會告訴我「沒有檢測到任何變化」,因此manage.py migrate什麼都不會做,但是我需要刪除已刪除應用程序創建的表格。使用Django 1.7遷移刪除應用程序

我希望Django的遷移來處理這個,所以如果我刪除一個應用程序也將創造遷移刪除所有necesary表。

+0

爲什麼不先刪除所有的應用程序的遷移,然後刪除應用程序? – JuniorCompressor 2015-02-08 14:26:58

+0

我改變了這個問題,我解釋自己錯了,我希望現在它更清楚! – diegopau 2015-02-08 14:34:53

+0

你有沒有想出一個解決方案?也遇到了麻煩。 – 2015-06-03 04:57:07

回答

3

首先,註釋掉應用程序models.py中的所有類。然後,像平常一樣創建一個新的遷移,它將刪除所有應用程序的表並運行它。最後,從您的代碼庫中刪除整個應用程序和所有對它的引用。

+0

這似乎是一個很好的解決方案,但使當應用程序被集成在我的項目,在這種情況下,我只是在我的virtualenv安裝包,並將其鏈接到我的項目將它添加到我的settings.py更有意義。我是Django的新手,所以它可能是愚蠢的我還沒有得到! – diegopau 2015-02-08 14:37:02

+1

要刪除整個應用程序,可以使用「python manage.py migrate [app_name] zero」 – potar 2015-08-04 07:39:06

1

將nachouve的答案擴展爲適當的django遷移,您可以使用RunSQL遷移所有DROP statements,請參閱django遷移文檔。

您可以把這個在你的應用程序要刪除或者在不同的應用程序(如果你已經刪除的應用程序或它的安裝,所以你不能編輯它)。

from django.db import migrations 

DROP_ACCOUNT_TABLES = """\ 
    DROP TABLE IF EXISTS account_account CASCADE; 
    DROP TABLE IF EXISTS account_accountdeletion CASCADE; 
    DROP TABLE IF EXISTS account_emailaddress CASCADE; 
    DROP TABLE IF EXISTS account_emailconfirmation CASCADE; 
    DROP TABLE IF EXISTS account_signupcode CASCADE; 
    DROP TABLE IF EXISTS account_signupcoderesult CASCADE; 
""" 


class Migration(migrations.Migration): 

    dependencies = [ 
     ('auth', '<< previous migations >>'), 
    ] 

    operations = [ 
     migrations.RunSQL(DROP_ACCOUNT_TABLES) 
    ] 
6

你必須要小心這一個,一定要了解:

例如,要刪除Django的用戶帳戶(其中有覆蓋差,是一種責任)後清理操作時,你這樣做被逆轉,但這樣的事情應該工作:

manage.py migrate <app_name> zero

很明顯,你必須從你的設置中刪除它,這樣使遷移是發現之前做到這一點。

編輯:這已經慢慢接受了幾個upvotes - 我想我會引導大家朝着appropriate documentation,特別是:

使用名稱零取消應用所有遷移的應用程序。