2017-09-26 153 views
0

前段時間,我開發了一個Django 1.8項目。幾個月前我部署了這個項目,一切都運行良好。今天,我必須對數據庫進行更改,但是當我嘗試運行python manage.py makemigrations時,我收到了消息「未檢測到更改」。然後我注意到項目的任何應用程序中都沒有遷移文件夾。我不明白的是:已遷移應用但沒有遷移文件夾

  • 我所做的遷移(makemigrations然後migrate)當我第一次部署的項目,一切正常。雖然我沒有檢查遷移文件夾在那裏。
  • 自第一次遷移以來,我沒有對數據庫進行任何更改,也沒有刪除任何文件夾。

當我運行python manage.py showmigrations,我得到如下:

admin 
[X] 0001_initial 
auth 
[X] 0001_initial 
[X] 0002_alter_permission_name_max_length 
[X] 0003_alter_user_email_max_length 
[X] 0004_alter_user_username_opts 
[X] 0005_alter_user_last_login_null 
[X] 0006_require_contenttypes_0002 
contenttypes 
[X] 0001_initial 
[X] 0002_remove_content_type_name 
sessions 
[X] 0001_initial 

這是完整輸出。沒有任何我的應用程序的跡象。

所以我的問題有以下幾點:

  • 這怎麼可能是遷移進行了改造,表創建等,但不遷移文件夾的創建?
  • 我該從哪裏出發?我想進行新的遷移,但幾乎所有重新遷移遷移的方法都包括步驟「刪除遷移文件夾」。

回答

3

允許應用程序沒有遷移。只有具有migrations/__init__.py文件的應用纔會被視爲進行遷移。除非您顯式傳遞應用程序名稱,否則manage.py makemigrations將不會爲未遷移的應用程序創建遷移。在Django 1.7/1.8上,表格仍然是通過舊的syncdb機制自動創建的 - 從Django 1.9開始,這需要在遷移時使用--syncdb標誌。

現在您需要將您的遷移與數據庫同步。爲此,您需要:

  1. 恢復最初運行manage.py migrate後所做的所有模型更改。
  2. 運行manage.py makemigrations <app_label>以創建與您當前數據庫匹配的初始遷移。
  3. 運行manage.py migrate --fake-initial <app_label>將新遷移標記爲已應用。

對每個應用程序運行這些步驟後,您的遷移應與數據庫同步,因此您現在可以編輯模型並創建新的遷移。

+0

這是完美的,非常感謝你。非常好的解決方案,使我能夠保存所有的數據。我忘記了用'startapp'創建的遷移文件夾,並且因爲我沒有將它們包含在git中,所以在拉到服務器時我沒有它們。 – Deuce