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 myappmanage.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

django数据迁移

django 10.5 sqlite3迁移到mysql

在开发过程中使用 Django、South 和 Sqlite [关闭]

怎么让wordpress用sqlite3 搭建轻量级博客系统