2016-04-04 8 views
19

Djangoのアプリケーションで作業しています。Herokuでの展開時にデータベースの移行を実行したいと思います。マイグレーションが実際に実行されている展開する場合Herokuの展開中に./manage.pyを実行する

python manage.py migrate 

が、彼らはそれぞれのダイノのために1回実行するようだ(と私たちはいくつかのdynosを使用):

は、これまでのところ、我々は単にProcfileで次のコマンドを入れています。その結果、(純粋なスキーマ移行とは対照的に)データ移行が数回実行され、データが複製されます。

デプロイ後にheroku run python manage.py migrateを実行すると、データベースを常にコードと同期させたいので、満足のいくものではありません。

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

ありがとうございました。

答えて

29

で最初のメンテナンスであなたのアプリを置くことができますプロセス: https://devcenter.heroku.com/articles/release-phase#defining-a-release-command

リリースコマンドはすぐに実行されますafリリースは作成されますが、リリースがアプリケーションのdynoの構成に展開される前に行われます。

  • アプリは
  • プラットフォーム経由のパイプラインのプロモーション
  • 設定するvar変更
  • ロールバック
  • リリースを構築する:それは新しいリリースを作成し、イベントの後に実行されることを意味しますAPI

releaseコマンドが正常に終了するまで、app dynosは新しいリリースでは起動しません。

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

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

更新:あなたはモデルやコンテンツタイプを削除移行を持っている場合は

、Djangoはコンソールで確認が必要

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

...

これらのコンテンツタイプに関連する外部キーによるオブジェクトもすべて削除されます。これらのコンテンツタイプを削除してもよろしいですか?確信が持てない場合は、「いいえ」と答えます。

Procfileのmigrateコマンドが応答せず、releaseコマンドが失敗します。このシナリオでは、マイグレーション・ラインを削除し、ライブをプッシュして、migrateコマンドを手動で実行し、将来のデプロイ用に追加し直します。

+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

マイグレーションはHerokuで自動的に実行されますが、今度はdynoがheroku run python manage.py migrateでデプロイされても安全に実行できます。

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

は、リリースを定義するにHerokuのドキュメントを参照してください:生産した場合

することは、あなたはこれが私のProcfileであり、あなたが記述どおりに働いているheroku maintenance:on

関連する問題