コミュニティがこの特定のシナリオをどのように処理するのかと思います。Djangoの移行:sqlite3開発データベース、Amazon Elastic Beanstalk、Amazon RDS postgresqlライブデータベース
開発データベースとしてSQLite3データベースを使用してローカルに開発するDjangoアプリケーションがあります。 ライブアプリケーションはAmazon Elastic Beanstalkでホストされ、Amazon RDS PostgreSQLデータベースを使用してプロダクションを行います。
アプリをデプロイするには、Djangoアプリをeb deploy
(ローカルのgitリポジトリから最新のコミット済みバージョンをプッシュする)でElastic Beanstalkにプッシュするだけです。環境はとても似ライブである場合に
settings.py
は、データベースとのチェックを設定します。
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.sqlite3',
'NAME': os.path.join(BASE_DIR, 'db.sqlite3'),
}
}
if 'RDS_DB_NAME' in os.environ:
from settings_live import *
とsettings_live.py
はそうのような生産設定にデータベース構成を変更します。
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.postgresql_psycopg2',
'NAME': os.environ['RDS_DB_NAME'],
'USER': os.environ['RDS_USERNAME'],
'PASSWORD': CREDENTIALS['RDS_PASSWORD'],
'HOST': os.environ['RDS_HOSTNAME'],
'PORT': os.environ['RDS_PORT'],
}
}
このすべてが正常に動作し、移行に関しては問題が発生します。たとえば、私の開発環境では、新しいモデルをアプリケーションのmodels.py
に作成します。変更後、私はmanage.py makemigrations myapp
とmanage.py migrate
を実行します。マイグレーションは私のsqlite3開発データベースに適切に適用されます。問題はありません。
次に、ライブ展開に備えて変更をコミットします。私の.gitignore
ファイルはdb.sqlite3
と*/migrations
を無視するように設定されています(これらの移行は開発データベースのみに適用されるため)。
次に、私の最新のコミット(私のdevデータベースや関連する移行を含まない)をeb deploy
のElastic Beanstalkにプッシュします。ここで
03_makemigrations:
command: "django-admin.py makemigrations myapp1 myapp2"
leader_only: true
04_migrate:
command: "django-admin.py migrate"
leader_only: true
が問題だ:
makemigrations
とElastic Beanstalkで環境で生成された以前の移行は、もはや以来
app/migrations
に存在していない私はそうのような本番データベースの移行を実行するために.ebextentionsファイル(
.ebextensions/02_commands.config
)を設定しています
eb deploy
デプロイメントプロセスは古いアプリケーションを新しいアプリケーションで上書きします(ブランク
migrations
ディレクトリのみが含まれます)。これにより、本番データベースにテーブルが作成されないなどの予期しない動作が発生します。私はと考えられてきた(それでも実装し始めていない)
一つの解決策は、*/migrations
にS3バケットからコピー移行ファイルのスクリプトを作成し、前makemigrations
とmigrate
を実行しているにこれを実行するために02_commands.config
を設定することです。その後、別のスクリプトを実行して、新しい移行ファイルをS3バケットにコピーします。私の全体のワークフローが間違っているのではないかと思います。
私は完全にマイグレーションの仕組みに間違った考え方を持っていました。あなたの応答を読んでから、DjangoのWebサイトにあるMigrationsのドキュメントに戻ってみると、はるかに理にかなっています。ありがとう! –