2017-09-01 74 views
0

我克隆了一個postgres分貝,併爲其中一個應用程序添加了一個新模型。我們的項目包含很多應用Django遷移爲一個克隆分區

現在當我運行migrations時,migrate它會失敗。所以我評論說,模型出來了,從文件夾中刪除了migrations.py文件並且運行了僞造的遷移。再次將該模型放入並運行migrationsmigrate。事情很好。

但是現在我手動從db中刪除了這個模型表,並且在運行遷移時它將顯示模型不存在。

基本上我需要一次又一次地調整模型,刪除,更新表。 所以我搜索了從頭開始遷移。從django_migrations表中刪除了一些應用程序。但它沒有解決它顯示已經存在的關係。

這一切都變得撲朔迷離,--fakedelete,squash該怎麼辦?

基本上,如果我刪除表django_migrations,從應用程序刪除migrations文件夾。不能django自動同步數據庫,並瞭解什麼樣的模式存在和不存在,並找出它本身。

+0

重做克隆。無需執行其他任何操作,請運行遷移。你碰到什麼錯誤?這對了解至關重要。只是試圖解決它,讓你陷入更多麻煩,正如你發現的那樣。 – Melvyn

+0

無論如何沒有再次克隆,這將意味着一次又一次的克隆。此外它需要管理員權限,郵件鏈等。 – garg10may

+0

不,它不。關鍵問題是要確定您的代碼庫是否與您的克隆一致。請注意,我說「運行遷移」,而不是「運行makemigrations,然後運行遷移」。只遷移。這確保您的代碼庫和克隆同步。也不完全確定你的最終目標是什麼?爲什麼要手動從數據庫中刪除表格? – Melvyn

回答

1

如果你想創建一個Django數據庫的克隆,但沒有數據,那麼有一張表應該總是從django_migrations獲取數據。這是保存數據庫狀態的表格:已經應用了哪些遷移,因此已經存在哪些模型。

Django試圖創建一個它是核心模型的事實告訴我,您沒有克隆中django_migrations的數據。

0

這解決了這個問題。

  • 刪除'django_migrations'表中的所有數據。
  • 刪除了所有遷移文件夾中的所有遷移文件在不同的應用程序
  • 註釋掉其表仍然沒有在數據庫
  • python manage.py makemigrations
  • python manage.py migrate --fake
  • 把評論關模式模型
  • ran python manage.py makemigrations
  • ran python manage.py migrate

這是要了解makemigrationsmigrate做什麼。然後您可以手動刪除/更新或創建新模型並遷移/克隆等等。對於新手來說,這些命令不會讓人困惑。

讓我們說一切都是空的,即應用程序的遷移文件夾中沒有文件。 比makemigrations使這些文件包含說sqls /語法關於如何創建您的表。隨着每次更改,它將創建一個新的,只有在此列出的變化。

migrate在數據庫中創建實際的空表。然後在django_migrations中針對該模型所屬的應用程序創建一個條目。該條目告訴它何時將該文件的最新條目應用於數據庫。

場景1: 我從db中手動刪除了一個表。現在django不知道這件事。所以如果你運行makemigrationsmigrate它不會做任何事情。

方案2: 我刪除了所有條目從django_migrations,從應用中刪除migrations文件。表格仍然在分貝。現在,當我做makemigrations它的作品,但是當我遷移它拋出錯誤已經存在。

方案3:django_migrationsmigration文件刪除的條目。 Django有一個選項migrate --fake,這告訴它表已經存在表只需在django_migrations表中進行輸入。所以makemigrationsmigrate --fake現在工作沒有錯誤。但現在我手動刪除的表格仍然被刪除,django沒有做到。所以當我嘗試訪問它時會拋出錯誤。

情景4: 我在開始描述的那個。我僞造了db中的條目,然後遷移了不在db中的模型。

所以一旦明白它在幕後做了什麼,可以採用很多方法,手動創建表格模式或選擇性地選擇django_migrationsmigrations文件條目並刪除它們。但最好是刪除所有內容並從頭開始。

django最好能理解這些表格已經創建好了,這些都是我的模型,創建了缺失的模型,離開了現有的模型。如果有差異顯示他們。我看到很多與移民有關的問題,人們在這裏和那裏都感到困惑。