使用AWS Elastic Beanstalk部署Django应用遇SQLite版本过低报错
报错根因
- Elastic Beanstalk(下文简称EB)的旧版Python运行环境基于Amazon Linux 1构建,系统自带的SQLite版本为3.7.17,低于Django要求的最低3.8.3版本。
- 你当前的Django配置默认使用本地文件型SQLite作为数据库,除了触发版本校验报错,本身也完全不适合EB的弹性伸缩场景——实例会被随时销毁替换,本地存储的SQLite文件会随实例丢失,也无法在多实例间共享。
解决方案
方案一:替换为AWS托管数据库(唯一推荐的生产可用方案)
直接弃用SQLite,将Django数据库替换为RDS托管的MySQL/PostgreSQL,从根源绕开SQLite版本限制,同时解决数据持久化和多实例共享问题。
执行步骤:
- 在EB环境配置中关联RDS数据库,或单独创建RDS实例后获取连接地址、端口、账号密码
- 修改settings.py中的
DATABASES配置,替换为RDS的连接参数,参考示例:
DATABASES = { 'default': { 'ENGINE': 'django.db.backends.postgresql', 'NAME': os.environ.get('RDS_DB_NAME'), 'USER': os.environ.get('RDS_USERNAME'), 'PASSWORD': os.environ.get('RDS_PASSWORD'), 'HOST': os.environ.get('RDS_HOSTNAME'), 'PORT': os.environ.get('RDS_PORT'), } }
- 在项目根目录的
requirements.txt中添加对应数据库的驱动:用PostgreSQL加psycopg2-binary,用MySQL加mysqlclient - RDS的连接参数全部通过EB的环境变量注入,不要硬写在代码里。
方案二:临时升级实例SQLite版本(仅本地测试用,禁止生产)
如果只是临时测试,非要用SQLite跑通流程,可以通过.ebextensions配置在实例初始化时编译安装高版本SQLite。
- 新建
.ebextensions/01-upgrade-sqlite.config文件,写入以下内容:
packages: yum: gcc: [] make: [] wget: [] commands: 01_download_sqlite: command: wget 获取3.8.3以上版本的SQLite官方源码包 02_extract_sqlite: command: 解压下载的源码压缩包 03_install_sqlite: command: 进入解压后的源码目录,执行编译安装到`/usr/local`路径 04_refresh_library_path: command: 执行ldconfig刷新系统动态库路径,让Python能调用到新版本SQLite
- 注意该方案每次实例重新初始化都会重新编译SQLite,部署速度慢,且数据仍然存在本地,实例销毁后全部丢失,绝对不能用于生产环境。
额外配置修正建议
- 将settings.py中的
DEBUG改为False生产模式,同时把EB环境的实际域名加入ALLOWED_HOSTS,不要直接配置为['*'] - 把
.ebextensions/db-migrate.config里的django-admin.py migrate改为python manage.py migrate,避免因环境变量加载顺序问题导致迁移命令找不到项目配置 - 在迁移命令前补充静态文件收集逻辑,改为执行
python manage.py collectstatic --noinput && python manage.py migrate,避免静态资源加载失败 - 将settings.py中的
SECRET_KEY、邮箱授权码、PayU密钥等敏感信息全部改为从EB环境变量读取,不要硬写在代码中避免泄露
内容的提问来源于stack exchange,提问作者Deepjyoti De
相关产品推荐
相关产品推荐

