2011-04-28 137 views
209

好的,所以這似乎是一個非常愚蠢的問題,我敢肯定我在某處丟失了某些東西。Django South向後遷移

如何在Django上使用South執行向後遷移?

所以我調整了我的模型,創建了schemamigration的遷移,使用migrate運行遷移,現在我意識到這不是我想要的,我希望它恢復原樣。

缺少手動編輯數據庫表和刪除遷移文件,我應該如何回滾遷移回來?我通過谷歌找到了使用南方的向後遷移參考,但尚未找到一個可靠的代碼示例。

任何人都可以幫忙嗎?

+0

好問題! – 2017-03-05 09:30:49

回答

328

你只需要要回滾一個前要弄清楚遷移的數量。

您的應用程序應該有一個遷移目錄,在它的文件命名爲喜歡

0000_initial.py 
0001_added_some_fields.py 
0002_added_some_more_fields.py 
0003_deleted_some_stuff.py 

通常情況下,當你運行./manage.py migrate your_app,南運行所有的新移民,爲了。 (它會查看數據庫表以確定哪些是「新」)。

但是,您也可以指定通過編號進行的任何遷移,South將遷移您的數據庫,向前或向後遷移,以使其達到該點。因此,與上面的例子中的文件,如果您已經遷移了到0003,而你想反向運行0003(撤消,從而有效),你可以運行

./manage.py migrate your_app 0002 

南會看看數據庫,實現它已經運行了0003,並確定它必須運行0003的反向遷移才能返回到0002.

+1

不幸的是,當你創建你的下一次遷移時,它不會跳過這兩者之間的遷移,所以你稍後再次遷移它們。似乎可能有更好的方法。 – mlissner 2011-07-02 19:51:58

+44

@mlissner如果您確實想要,在回滾數據庫之後,請轉到給定應用程序的migrations文件夾(在上面的示例your_app/migrations中)並刪除不需要的遷移 – 2011-08-16 00:15:06

+1

正確 - 南從不跳過遷移;它期望來自0001-nnnn的文件代表一組一致的遷移,對於任何nnnn值。如果情況並非如此,那麼您需要自行重新訂購或刪除違規產品。 – 2011-08-19 15:13:38

3

在參數末尾添加遷移名稱:

./manage.py migrate app-name 00xx-migration-name 
+2

沒關係,我以前做過,但是很多打字/粘貼。裸露的「狀態」號碼(在本例中爲「00xx」)就足夠了。在改進和測試遷移時,您可以在歷史記錄中使用這兩個命令:向前(無參數),向後與之前的狀態編號。 – 2013-02-01 09:14:34

217

爲了防萬一有人(像我)想知道如何從最初(0001)遷移回

django-admin.py migrate some_app zero 

輸出:

Running migrations for some_app: 
- Migrating backwards to zero state. 
< some_app:0001_initial 

「零」是任何遷移前的特殊狀態。

參考:http://south.aeracode.org/docs/commands.html

+6

有人跑了0001 - 變成了,這是反向運行0001的唯一方法。謝謝! – jmanning2k 2012-07-06 22:12:40

+0

非常重要的答案,我想知道爲什麼'遷移0000'不起作用。關於假移民,是的,你可能需要它,如果你只需撤消(可能是錯誤的)初始遷移,但遷移歷史認爲,此遷移從未發生過。 – 2014-01-16 16:01:58

+0

Tomaszu,'migrate 0000'只是運行前綴爲「0000」的遷移方便捷徑。既然你沒有這樣的標準,它找不到它。 無論如何,我不知道爲什麼開發者決定這樣直觀的名稱。 編輯:哦,我可以看到下面你知道前綴;] – 2014-01-26 21:10:44