Django 迁移:sqlite3 开发数据库、Amazon Elastic Beanstalk 和 Amazon RDS postgresql 实时数据库
Django migrations: sqlite3 development db, Amazon Elastic Beanstalk and Amazon RDS postgresql live database
我想知道社区将如何处理这种特殊情况。
我有一个 Django 应用程序,我使用 SQLite3 数据库作为我的开发数据库在本地开发。
实时应用程序托管在 Amazon Elastic Beanstalk 上,并使用 Amazon RDS PostgreSQL 数据库进行生产。
要部署应用程序,我只需使用 eb deploy
将 Django 应用程序推送到 Elastic Beanstalk(从本地 git 存储库推送最新提交的版本)。
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
(因为这些迁移仅适用于开发数据库)。
然后我使用 eb deploy
将我的最新提交(不包含我的开发数据库或相关迁移)推送到 Elastic Beanstalk。我已经配置了一个 .ebextentions 文件 (.ebextensions/02_commands.config
) 以在生产数据库上进行 运行 迁移,如下所示:
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
中不再存在,因为 eb deploy
部署过程用新的(只包含一个空白的 migrations
目录)。这会导致一些意外行为,例如未在生产数据库中创建表。
我考虑过(但还没有开始实施)的一个解决方案是创建一个脚本,将迁移文件从 S3 存储桶复制到 */migrations
并将 02_commands.config
配置为 运行 这在 运行 宁 makemigrations
和 migrate
之前。然后 运行 另一个脚本将新的迁移文件复制回 S3 存储桶。我只是想知道我的整个工作流程是不是错了。
你说迁移只适用于开发数据库是错误的。那是错误的。迁移的全部意义在于它们正是为了让您的开发和生产数据库保持同步。它们是您代码的一部分;它们应该与所有其他代码一起提交,部署到生产环境,然后 运行 在那里。
我想知道社区将如何处理这种特殊情况。
我有一个 Django 应用程序,我使用 SQLite3 数据库作为我的开发数据库在本地开发。 实时应用程序托管在 Amazon Elastic Beanstalk 上,并使用 Amazon RDS PostgreSQL 数据库进行生产。
要部署应用程序,我只需使用 eb deploy
将 Django 应用程序推送到 Elastic Beanstalk(从本地 git 存储库推送最新提交的版本)。
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
(因为这些迁移仅适用于开发数据库)。
然后我使用 eb deploy
将我的最新提交(不包含我的开发数据库或相关迁移)推送到 Elastic Beanstalk。我已经配置了一个 .ebextentions 文件 (.ebextensions/02_commands.config
) 以在生产数据库上进行 运行 迁移,如下所示:
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
中不再存在,因为 eb deploy
部署过程用新的(只包含一个空白的 migrations
目录)。这会导致一些意外行为,例如未在生产数据库中创建表。
我考虑过(但还没有开始实施)的一个解决方案是创建一个脚本,将迁移文件从 S3 存储桶复制到 */migrations
并将 02_commands.config
配置为 运行 这在 运行 宁 makemigrations
和 migrate
之前。然后 运行 另一个脚本将新的迁移文件复制回 S3 存储桶。我只是想知道我的整个工作流程是不是错了。
你说迁移只适用于开发数据库是错误的。那是错误的。迁移的全部意义在于它们正是为了让您的开发和生产数据库保持同步。它们是您代码的一部分;它们应该与所有其他代码一起提交,部署到生产环境,然后 运行 在那里。