2017-09-14 226 views
0

在我的生產服務器上,我意外刪除了我的一個應用程序中的遷移目錄。多個人在應用程序上工作,所以在製作應用程序時,我們所做的是在不進行本地任何遷移的情況下推進我們的模型更改,而是在生產服務器上進行遷移並遷移到那裏。我們這樣做是因爲我們過去曾經有過遷移合併問題,並認爲這可能是一個很好的解決方案。由於沒有遷移文件夾的本地副本,我擔心它永遠消失了。我的問題是這個。我可以訪問Webfaction中的phpPgAdmin,並且該數據庫有一個django_migrations表。我認爲一種解決方案是找到最新的遷移,例如說0009_migration.py,而不是簡單地重新命名一個新的遷移文件0010_migration.py用於我的下一次遷移,如果我將來在該應用程序中進行任何模型更改。這樣我就可以簡單地運行遷移,並且只會考慮遷移它尚未運行的0010_migration.py。但出於好奇,是否有一些命令會查看你的PostgreSQL數據庫,並從它在django_migrations表中存儲的遷移記錄在你的應用程序遷移目錄中創建遷移文件?恢復已刪除的Django遷移

我想一個簡單的方法來問這是「有沒有辦法進行反向工程django_migrations錶行到migrations.py文件?」這是一個django_migration錶行我有PostgreSQL和我的形象會希望文件看起來像,只是用不同的命令。

Django的遷移

class Migration(migrations.Migration): 

    dependencies = [ 
     ('portfolio', '0001_initial'), 
    ] 

    operations = [ 
     migrations.AddField(
      model_name='project', 
      name='contact_form', 
      field=models.BooleanField(default=False), 
     ), 
    ] 

PostgreSQL的django_migrations錶行 enter image description here

+0

說真的,將來不要這樣做。遷移是您的代碼庫的一部分,需要進行版本控制。 –

+0

我同意丹尼爾,它是我們黑暗過去的一部分,我們都從我們的錯誤中吸取教訓,在這種情況下,它仍然受到它的困擾。 – JBT

回答

2

1)數據庫的遷移表的一個應用,其遷移文件被刪除了所有entires刪除。

2)$ python manage.py makemigrations <app>

這產生新的遷移文件(inital遷移)。

3)$ python manage.py migrate <app> --fake

寫入初始遷移到遷移表,但不觸及任何其他表(實際上不遷移)。

只要沒有更改其遷移文件被刪除的應用程序,就應該可以工作。

這可能會解決意外刪除遷移文件的問題(假設它們是由manage.py自動創建的並且未被操縱)。但是我不知道它是否可以或者是否推薦重構遷移表 - 它也可能導致適應遷移文件的自動創建,需要在自動創建後手動操縱任何遷移文件甚至需要重寫django後端。

編輯

答案在註釋的附加問題:

  • 初始$ python manage.py makemigrations <app>創建一個描述給定的應用,該車型的電流模式(遷移文件$ python manage.py makemigrations會替所有應用程序)。
  • 初始$ python manage.py migrate <app>適用給定的應用程序到數據庫的所有遷移文件,並寫入到遷移文件被應用遷移表。在初始遷移時,將創建具有所需屬性和關係的所有需要​​的數據庫表($ python manage.py migrate對所有應用程序都這樣做)。
  • $ python manage.py makemigrations <app>將創建一個描述差異遷移文件(這樣的模式的模式在這個應用程序的最新說明)之間以及模型的當前模式在此應用程序遷移文件。
  • 數據庫的遷移表僅包含有關的信息,其中遷移文件其中應用程序已應用於數據庫。
  • 以下$ python manage.py migrate <app>將使用該遷移表來檢查哪些遷移文件已被應用到數據庫。如果存在未應用的遷移文件,則會應用這些文件,然後將其寫入遷移表。

所以,如果你刪除一個應用程序的遷移文件,你只是刪除描述和型號的該應用程序的架構的歷史。遷移表中的條目也是如此:您只需刪除有關的信息,其中遷移文件應用於您的數據庫。

  • $ manage.py migrate <app> --fake還會檢查哪些遷移文件必須應用於您的數據庫,並且還會將所有要遷移的遷移文件寫入您的遷移表。但是這個命令不會將應用到你的數據庫。

所以我建議實際的解決方案確實是這樣的:

    哪些遷移文件已應用到數據庫中一個特定的應用程序
  1. 創建一個一個新的遷移文件
  2. 刪除信息應用程序
  3. 將遷移文件寫入遷移表,但不應用它。 < <這就是爲什麼從遷移文件刪除後,您的應用程序模型不得有任何更改。

爲什麼需要刪除遷移表中的現有條目?

正如您在問題中提供的映像中所看到的,遷移中的條目存儲所有應用遷移文件的名稱。不刪除這些條目將導致manage.py migrate假設已經應用具有相同名稱(或數字 - 我不是100%知道這一點)的遷移文件。所以這些會在跳過時跳過。

+0

感謝Max,並且這不會影響我現有的數據或應用程序的模型模式,我正在從正確的方向刪除django_migrations行? – JBT

+0

簡單的答案是*是*。我會在我的答案中詳細說明。 –