web-dev-qa-db-ja.com

Herokuのデプロイ中に./manage.py migrateを実行する

Djangoアプリで作業しています。Herokuにデプロイするときにデータベースの移行を実行したいと思います。

これまでのところ、次のコマンドをProcfileに追加しました。

python manage.py migrate

マイグレーションをデプロイすると実際に実行されますが、各dynoに対して1回実行されるようです(複数のdynoを使用します)。その結果、(純粋なスキーマ移行とは対照的に)データ移行が数回実行され、データが複製されます。

ランニング heroku run python manage.py migrateデータベースを常にコードと同期させたいため、展開後は満足のいくものではありません。

Herokuでこれを行う正しい方法は何ですか?

ありがとう。

40
Vincent Perez

これは私の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

リリースコマンドは、リリースが作成された直後、アプリのdynoフォーメーションにリリースがデプロイされる前に実行されます。つまり、新しいリリースを作成するイベントの後に実行されます。

  • アプリのビルド
  • パイプラインプロモーション
  • 構成変数の変更
  • ロールバック
  • プラットフォームAPIを介したリリース

Releaseコマンドが正常に終了するまで、アプリdynoは新しいリリースで起動しません。

リリースコマンドがゼロ以外の終了ステータスで終了した場合、またはdynoマネージャーによってシャットダウンされた場合、リリースは破棄され、アプリのフォーメーションにデプロイされません。

ただし、この機能はまだベータ版です。

更新:

モデルとコンテンツタイプを削除する移行がある場合、Djangoはコンソールでの確認が必要です

次のコンテンツタイプは古く、削除する必要があります。

...

外部キーによってこれらのコンテンツタイプに関連するオブジェクトも削除されます。これらのコンテンツタイプを削除してもよろしいですか?不明な場合は、「いいえ」と答えてください。 「yes」と入力して続行するか、「no」と入力してキャンセルします。

Procfileのmigrateコマンドは応答せず、releaseコマンドは失敗します。このシナリオでは、移行ラインを削除し、ライブプッシュし、移行コマンドを手動で実行し、その後の展開のために追加し直します。

58
tomcounsell

移行はHerokuで自動的に実行されますが、現時点では、dynoがheroku run python manage.py migrate

本番の場合は、heroku maintenance:on

21
cvng

ファイルを作成できますbin/post_compileビルド後にbashコマンドを実行します。
まだ実験的と見なされていることに注意してください。
ビルドパックの詳細についてはこちらをご覧ください
例についてはこちらを参照

別の方法として、Herokuは 新しいリリース機能に取り組んでいます であり、このプロセスを簡素化して解決することを目的としています。 (現在ベータ版)。

がんばろう!

3
grokpot

Procfile

release: python manage.py migrate --noinput
web: gunicorn mysite.wsgi

https://devcenter.heroku.com/articles/release-phase#specifying-release-phase-tasks で文書化

1
Harry Moreno