Django 迁移:sqlite3 开发数据库、Amazon Elastic Beanstalk 和 Amazon RDS postgresql 实时数据库
Posted
技术标签:
【中文标题】Django 迁移:sqlite3 开发数据库、Amazon Elastic Beanstalk 和 Amazon RDS postgresql 实时数据库【英文标题】:Django migrations: sqlite3 development db, Amazon Elastic Beanstalk and Amazon RDS postgresql live database 【发布时间】:2016-10-21 19:53:48 【问题描述】:我想知道社区将如何处理这种特殊情况。
我有一个 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
问题是:以前在 Elastic Beanstalk 环境中使用 makemigrations
生成的任何迁移都不再存在于 app/migrations
中,因为 eb deploy
部署过程会用新应用程序覆盖旧应用程序(其中仅包含一个空白migrations
目录)。这会导致一些意外行为,例如未在生产数据库中创建表。
我考虑过(但还没有开始实施)的一个解决方案是创建一个脚本,将迁移文件从 S3 存储桶复制到 */migrations
并配置 02_commands.config
以在运行 makemigrations
之前运行它和migrate
。然后运行另一个脚本,将新的迁移文件复制回 S3 存储桶。我只是想知道我的整个工作流程是否出现了问题。
【问题讨论】:
【参考方案1】:您的错误在于说迁移仅适用于开发数据库。那是假的。迁移的全部意义在于,它们正是为了使您的开发和生产数据库保持同步。它们是您代码的一部分;它们应该与所有其余代码一起提交,部署到生产环境并在那里运行。
【讨论】:
哦,伙计,我对迁移的工作方式完全有错误的想法。阅读您的回复,然后返回 Django 网站上的 Migrations 文档,so 更有意义。谢谢!以上是关于Django 迁移:sqlite3 开发数据库、Amazon Elastic Beanstalk 和 Amazon RDS postgresql 实时数据库的主要内容,如果未能解决你的问题,请参考以下文章
Django 数据库迁移错误(sqlite3->postgre)
搭建 python 3.5+pycharm 2017.1.3+django 1.12.0 首次 将sqlite3 迁移到mysql