2014-04-09 115 views
0

在學習南方的過程中,我犯了一些我想要誦讀的錯誤。這裏是其中的一個:Django south,刪除特定的遷移

# migrate --list 
(*) 0002_auto__add_lesson #add the table 
(*) 0003_auto__del_lesson #dammit, table uses wrong db engine so delete it 
(*) 0004_auto__add_lesson #recreate the table 

很顯然,我可以只運行第4和第2,並且如果他們出演3將不會被應用:

./migrate my_app 0004 

但作爲步驟2和3是多餘的並且不需要運行,是否可以簡單地刪除它們?另外,我要補充進出口擔心有人可能只是運行遷移然後將刪除該表(和任何數據),然後重新創建它...

由於提前,

+0

如果您運行'... migrate my_app 0004',那麼您將應用遷移2,3和4. – Suor

回答

3

有兩個方面的考慮在這裏。

首先,如果您已經運行遷移,那麼它會記錄在數據庫中,如果您只是刪除文件,則會遇到問題:您的數據庫將引用不存在的遷移。有一個解決方案:用./manage.py migrate my_app 0001向後運行遷移2和3,然後刪除遷移文件。如果您無法遷移回來(例如,您手動與數據庫混淆),那麼您可以使用./manage.py migrate my_app 0001 --fake進行僞造遷移,並且應該手動設置數據庫。假意味着不會改變模式,但遷移運行的註釋將被刪除。

其次,您推送了您的代碼,而其他人已經運行了您的遷移。在這種情況下,您需要創建一個新遷移,以恢復您使用2和3所做的任何操作。通過這種方式,任何人都可以通過運行新遷移來恢復不必要的更改。

+0

感謝您的回答,但是您能否對此有點冗長? '使用./manage.py向後運行遷移2和3,遷移my_app 0001,然後刪除遷移' - 我不確定您的意思。「 – rix

+0

命令'./manage.py migrate my_app '。不運行遷移'some-number'它運行遷移,直到應用了'some-number'的所有東西。示例1:您已將遷移最多包含到2,並運行'.... 0004' =>遷移3和4運行。示例2:相同的位置並運行'... 0001' =>遷移2向後運行。 – Suor

+0

當然,只要刪除它們即可。這就是遷移的重點,能夠隨時回到遷移1! ./manage.py遷移0002 RM 遷移/ 0003 .... RM 遷移/ 0004 .... 完成。 –