执行eb deploy部署Django到ElasticBeanstalk报SQLite版本错误
根因说明
- Django 3.1部署报错:当前所用Elastic Beanstalk运行环境预装的SQLite版本为3.7.17,低于Django 3.1要求的最低3.8.3版本,触发版本校验失败。
- 降级到Django 2.1后的报错:Django 2.1不支持
pathlib.PosixPath类型作为数据库路径参数,settings.py中DATABASES配置的NAME字段使用了BASE_DIR / 'db.sqlite3'这类Path对象写法,旧版Django无法识别该类型。
解决方案
生产环境推荐方案
Elastic Beanstalk实例的本地存储是临时存储,实例重启、扩容替换、版本更新时都会清空本地数据,存储在SQLite中的数据会完全丢失,生产环境禁止使用SQLite作为数据库,按以下步骤调整:
- 在AWS控制台创建RDS实例,可选MySQL、PostgreSQL等官方支持的数据库引擎
- 将RDS实例与EB环境配置在同一个VPC下,调整安全组规则允许EB实例访问RDS的数据库端口
- 修改
settings.py中的DATABASES配置,适配RDS的连接参数、数据库引擎 - 重新执行
eb deploy即可完成部署
临时测试场景方案(仅测试用,不建议生产使用)
方案1:保留Django 2.1版本
修改settings.py中的数据库配置,将Path对象转为字符串即可:
DATABASES = { 'default': { 'ENGINE': 'django.db.backends.sqlite3', 'NAME': str(BASE_DIR / 'db.sqlite3'), } }
方案2:保留Django 3.1+版本
两种选择任选其一:
- 更换更高版本的EB Python运行平台,新版Amazon Linux 2的Python运行环境预装的SQLite版本已经满足3.8.3以上的要求
- 通过
.ebextensions配置在部署时手动编译安装高版本SQLite:
在项目根目录创建.ebextensions/upgrade_sqlite.config文件,写入以下配置:
packages: yum: gcc: [] make: [] wget: [] commands: 01_download_sqlite: command: wget https://sqlite.org/2022/sqlite-autoconf-3390200.tar.gz cwd: /tmp test: test ! -f /usr/local/bin/sqlite3 02_extract_sqlite: command: tar xzf sqlite-autoconf-3390200.tar.gz cwd: /tmp test: test ! -f /usr/local/bin/sqlite3 03_compile_sqlite: command: ./configure --prefix=/usr/local && make && make install cwd: /tmp/sqlite-autoconf-3390200 test: test ! -f /usr/local/bin/sqlite3 04_update_lib_path: command: echo '/usr/local/lib' > /etc/ld.so.conf.d/sqlite3.conf && ldconfig
配置完成后重新执行eb deploy即可通过版本校验。
内容的提问来源于stack exchange,提问作者Guillaume Ayad
相关产品推荐
相关产品推荐

