2016-04-04 49 views
19

我正在使用Django應用程序,並且希望在部署到Heroku上時運行數據庫遷移。在Heroku部署期間運行./manage.py遷移

到目前爲止,我們只需要進入Procfile以下命令:

python manage.py migrate 

當部署遷移確實運行,但他們似乎對每個DYNO運行一次(我們使用幾個DYNOS)。因此,數據遷移(與純粹的模式遷移相對)會多次運行,並且數據會被複制。

在部署之後運行heroku run python manage.py migrate令人不滿意,因爲我們希望數據庫始終與代碼同步。

在Heroku中做到這一點的正確方法是什麼?

感謝。

回答

29

的應用將能維持第一這是我Procfile,當你描述它一樣工作:在確定發行

release: python manage.py migrate 
web: run-program waitress-serve --port=$PORT settings.wsgi:application 

見的Heroku文檔進程: https://devcenter.heroku.com/articles/release-phase#defining-a-release-command

release命令立即運行這個版本是在創建版本之前,但是在發行版被部署到應用程序的測試版之前。這意味着它會創建一個新版本的事件後運行:

  • 的應用程序建立
  • 的管線鋪設推廣
  • 一個配置無功變化
  • 回滾
  • 通過平臺發佈API

直到release命令成功完成,應用程序dynos纔會在新版本上引導。

如果釋放命令以非零退出狀態退出,或者由dyno管理器關閉,則釋放將被丟棄,不會部署到應用程序的陣型。

但請注意,此功能仍處於測試階段。

更新:

當你有刪除模式和內容類型的遷移,Django的需要在控制檯

以下內容類型是陳舊,需要刪除的確認:

...

任何通過外鍵與這些內容類型相關的對象也將被刪除。您確定要刪除這些內容類型嗎?如果您不確定,請回答「否」。輸入'yes'繼續,或'no'取消:

Procfile中的migrate命令沒有響應,release命令失敗。在這種情況下,請移除遷移線,push live,手動運行遷移命令,然後將其添加回未來部署。

+10

由於Django 1.9,您可以使用'manage.py migrate --noinput' https://docs.djangoproject.com/en/1.10/ref/django-admin/#cmdoption-migrate-noinput – Joren

+1

'manage.py migrate --noinput可以在Django 1.7+上運行。在1.9中,他們添加了「--no-input」別名。 –

8

migrate會自動在Heroku上運行,但現在您可以安全地使用heroku run python manage.py migrate部署您的dyno。

如果生產,你可以用heroku maintenance:on

相關問題