假設我們有一個名為Alpha的 Django 專案。在將 Django 專案部署到 Heroku 之前,開發人員在他們的開發環境中使用 Alpha。Procfile 可能類似于:
release: python manage.py migrate
web: python -m gunicorn wsgi:application
當開發人員嘗試部署新版本的 Alpha 時,該專案連同其遷移檔案一起交付(如推薦的那樣)。在部署結束時,Heroku 將執行該release陳述句python manage.py migrate以對資料庫進行所有相關更改。因為發布是整個部署程序的一部分,如果它失敗了,那么新的代碼將不會被部署。
然而......雖然代碼將恢復到部署之前的狀態(如預期的那樣),但對 Heroku 資料庫的潛在更改將是永久性的。例如,假設新版本有三個新的遷移:
001100120013
前兩個遷移正確執行,資料庫相應更改。它們也被添加到資料庫表中django_migrations。然而,最后一個包含一個問題(例如,它定義了階段資料不遵守的約束)。
在這種情況下,Heroku 上的代碼(/migrations/和models.py)和 Heroku 上的資料庫現在嚴重不同步:事實上,資料庫反映的更改甚至不存在于代碼存盤庫中。這會產生各種各樣的問題。
如何防止在這個謂詞中找到自己并確保代碼和資料在舞臺和產品上始終 100% 同步?
后經
Heroku將以下代碼段作為其檔案的一部分:
使用事務進行資料庫遷移
執行資料庫遷移時,始終使用事務。事務確保所有遷移操作在向資料庫提交更改之前都成功,從而將發布階段部分遷移失敗的可能性降到最低。如果在發布階段資料庫遷移失敗(即遷移命令以非零狀態退出),則不會部署新版本。如果不使用事務,這可能會使資料庫處于部分遷移的狀態。我們建議使用 heroku 運行而不是發布階段來進行架構/資料更正。
uj5u.com熱心網友回復:
正如您參考的檔案所說,在事務中進行遷移是一個好主意。這是一個好主意,Django 默認使用支持它的資料庫來執行此操作。
但這僅有助于一次遷移的范圍:如果遷移0013如您的示例中那樣失敗,則它引入的更改將被回滾。0011遷移帶來的變化0012不會被逆轉。
要反向遷移0011,0012您必須手動回滾,例如
python manage.py migrate myapp 0010
但是由于如果部署失敗,您的應用程式將運行以前的版本,所以不能簡單地heroku run這樣做——Heroku 沒有 和 的遷移0011檔案0012。
這很可能,至少部分是 Heroku 檔案說的原因
我們建議使用
heroku run而不是發布階段來進行架構/資料更正。
如果您洗掉遷移發布階段命令,您可以像這樣開始部署:
git push heroku main
heroku run python manage.py migrate
如果遷移失敗,只需反轉最后兩次遷移,然后回滾到以前的版本:
heroku run python manage.py migrate myapp 0010
heroku releases:rollback
作為一項額外的預防措施,請考慮在開始升級之前將您的應用程式置于維護模式。這將阻止用戶在您的站點可能處于不一致狀態時與您進行互動,例如在您部署之后但在您應用遷移之前。
轉載請註明出處,本文鏈接:https://www.uj5u.com/qianduan/460366.html
標籤:Python django heroku django-迁移 heroku-postgres
上一篇:芹菜作業不在Heroku上運行(python/django應用程式)
下一篇:使用Heroku的React應用程式部署不起作用。未找到模塊:錯誤:無法在“/tmp/build...”中決議(...)
