2017-10-16 68 views
3

我一直是Django的用戶,現在已經有2年多了,並且有一個我一直非常喜歡使用的功能:僞造遷移Django migrate --fake and --fake-initial explained

我看了幾乎無處不在,我可以得到最多的信息是從documentation它指出:

--fake

告訴Django,以紀念遷移具有已應用或 未應用,但未實際運行SQL以更改您的 數據庫架構。

這適用於高級用戶直接操作當前的 遷移狀態,如果他們手動應用更改;是 警告說,使用--fake運行將遷移狀態 錶轉換爲需要手動恢復才能使 遷移正確運行的狀態的風險。

--fake-初始

允許,如果已存在的所有數據庫 表與所有CreateModel 操作在移民創建的所有模型的名稱Django的跳過應用程序的初始遷移。當首次運行鍼對數據庫的遷移時,此選項的用途爲 , 預先使用遷移。但是,此選項不檢查 是否將數據庫架構與匹配的表名進行匹配,因此如果您確信現有的架構 與您在初始遷移中記錄的內容相匹配,那麼只有安全使用 。

我明白了爲什麼要使用此功能。但是,我不明白它說這是只適用於高級用戶的部分。

有人可以解釋幕後發生的事情以及爲什麼需要手動恢復。

注意

我不是尋找一個僞造遷移時運行的確切原始的SQL查詢。我只是在尋找關於現場背後發生的一般想法,並且可能舉例說明爲什麼僞造遷移 會導致makemigrations無法正常工作的狀態。

回答

3

想象一下,您上週開始修改應用程序,可能是因爲您發現了一個錯誤,或者您是通過字段或列擴展它的。今天,您收到了一個更新,並且您遇到問題,因爲有一項遷移會添加一個仍在數據庫中的字段,並且您只能應用該遷移的其他部分。您可以通過運行

./manage sqlmigrate some_app 0007_new_migration >customized-some_app-0007_new_migration.sql 

比較上週做出改變和刪除內容或評論指出,仍適用,不能重複命令看看它的SQL內容。手動運行所有剩餘的SQL。馬克像它會在遷移自動應用:

./manage migrate --fake some_app 0007_new_migration 

如果你碰壞大概沒有人可以幫助你,而且您或遷移系統知道數據庫的當前狀態。因此,備份,寫筆記,使用沙箱並精確地工作。

EDIT遷移表django_migrations是在所有應用施加遷移的簡單列表。此表中的行應始終與數據庫結構保持同步狀態。遷移可以通過正常的遷移來應用。 (或通過反向遷移應用到舊狀態,通常當然有一些數據丟失)。假遷移僅將更改應用於django_migrations表。

me => select * from django_migrations; 
id | app  |   name   |   applied    
----+----------+-------------------------+------------------------------- 
    1 | some_app | 0001_initial   | 2017-10-16 06:11:07.31249+02 
    2 | some_app | 0002_auto_20171016_1905 | 2017-10-17 02:05:48.979295+02 

遷移(文件)是增量的變化,信息的描述,可以評估自上次遷移模式的差異而運行makemigrations。在一些表格最初未被管理並且稍後可以被管理的情況下也是足夠的。

EDIT一個實例如何sqlmigrate--fake可以用來fix a broken database by migrations(重新建立已刪除表)。

+0

感謝您的回答!它幫助我看到了僞造移民的真實情況,但我仍然想知道在僞造移民的過程中發生了什麼。 – scharette

+0

@scharette是的,有用的問題。解釋。 – hynekcer