Django部署AWS EBS报错:deterministic=True需SQLite3.8.3+版本
问题说明
尝试将使用默认SQLite数据库的Django应用部署至Elastic Beanstalk,应用在本地环境运行完全正常,部署到服务器后访问抛出NotSupportedError错误,错误信息:
deterministic=True requires SQLite 3.8.3 or higher
错误截图:
核心疑问:是否AWS Elastic Beanstalk不支持部署使用SQLite数据库的Django应用?
部署包项目结构
├── .ebextensions │ ├── django.config ├── app │ ├── __init__.py │ ├── admin.py │ ├── apps.py │ ├── migrations │ │ ├── 0001_initial.py │ │ ├── __init__.py │ ├── models.py │ ├── static │ │ └── app │ │ ├── app.js │ │ ├── logo.svg │ │ └── style.css │ ├── templates │ │ └── app │ │ ├── hello.html │ │ ├── index.html │ │ └── job_detail.html │ ├── tests.py │ ├── urls.py │ └── views.py ├── db.sqlite3 ├── env │ ├── All Virtual env related files ├── images │ ├── Photo_on_5-9-14_at_2.31_PM.jpg │ ├── Photo_on_5-9-14_at_2.32_PM.jpg │ └── Photo_on_5-9-14_at_2.32_PM_v4McLzE.jpg ├── myproject-test │ ├── __init__.py │ ├── asgi.py │ ├── settings.py │ ├── urls.py │ └── wsgi.py ├── manage.py ├── requirements.txt ├── staticfiles │ |-- All static files collected using collectstatic │ ├── app │ │ ├── app.js │ │ ├── logo.svg │ │ └── style.css │ └── subscribe │ ├── email-icon.png │ ├── main.css │ └── main.js ├── subscribe │ ├── __init__.py │ ├── admin.py │ ├── apps.py │ ├── form.py │ ├── migrations │ │ ├── 0001_initial.py │ │ ├── 0002_subscribe_option_alter_subscribe_email_and_more.py │ │ ├── 0003_alter_subscribe_option.py │ ├── models.py │ ├── static │ │ └── subscribe │ │ ├── email-icon.png │ │ ├── main.css │ │ └── main.js │ ├── templates │ │ └── subscribe │ │ ├── subscribe.html │ │ └── thank_you.html │ ├── tests.py │ ├── urls.py │ └── views.py ├── templates │ └── base.html ├── upload │ └── images │ ├── Photo_on_5-9-14_at_2.31_PM.jpg │ └── Photo_on_5-9-14_at_2.31_PM_3.jpg └── uploads ├── __init__.py ├── admin.py ├── apps.py ├── forms.py ├── images │ └── Photo_on_5-9-14_at_2.31_PM_3.jpg ├── migrations │ ├── 0001_initial.py │ ├── 0002_uploadfile.py │ ├── 0003_alter_uploadfile_file.py │ ├── __init__.py ├── models.py ├── templates │ └── uploads │ ├── add_file.html │ └── add_image.html ├── tests.py ├── urls.py └── views.py
部署操作流程
- 将所有必要文件打包为zip压缩包
- 选择Python运行环境创建AWS Elastic Beanstalk应用
- 配置添加所需环境变量
- 完成应用创建后访问对应URL触发上述错误
问题根因
Elastic Beanstalk本身支持运行SQLite,报错的核心原因是:
- EBS默认Amazon Linux环境预装的系统SQLite版本低于3.8.3
- Django 3.2及以上版本操作SQLite时会传入
deterministic=True参数,该参数要求SQLite版本≥3.8.3,低版本无法识别该参数直接抛出错误。
额外注意:生产环境不推荐使用SQLite。EBS实例是无状态资源,实例扩缩容、替换、故障重启时本地存储的db.sqlite3文件会直接丢失,多实例部署时各实例的SQLite文件也无法同步,会导致数据不一致。
另外当前部署包存在冗余问题:本地虚拟环境env目录、本地上传文件目录images/upload、本地数据库文件db.sqlite3都被打包,其中本地虚拟环境和服务器系统不兼容,很容易引发额外的依赖冲突,建议新增.ebignore文件排除上述无关目录,缩小部署包体积。
解决方案
方案1:仅用于临时测试,不推荐生产使用
通过ebextensions配置在实例部署时编译安装高版本SQLite,替换系统默认的低版本库:
- 在
.ebextensions目录下新建01_upgrade_sqlite.config文件 - 写入配置,部署时实例会自动编译安装符合版本要求的SQLite:
commands: 01_install_sqlite: command: | # 下载3.8.3以上版本的SQLite源码编译安装 tar xzf sqlite-autoconf-*.tar.gz cd sqlite-autoconf-* ./configure --prefix=/usr/local make make install echo "/usr/local/lib" >> /etc/ld.so.conf ldconfig 02_link_sqlite: command: ln -sf /usr/local/lib/libsqlite3.so.0 /usr/lib64/libsqlite3.so.0
- 确保实例有公网访问能力可拉取SQLite源码包,重新部署后重启应用即可生效。
方案2:生产环境推荐方案
切换使用AWS RDS托管数据库(PostgreSQL/MySQL均可),从根源规避SQLite版本问题和本地存储的数据可靠性问题:
- 在EBS控制台为应用关联对应引擎的RDS实例,EBS会自动把数据库连接信息注入环境变量
- 修改项目
settings.py中的数据库配置,读取环境变量连接RDS:
import os DATABASES = { 'default': { 'ENGINE': 'django.db.backends.postgresql_psycopg2', # 使用MySQL则替换为django.db.backends.mysql 'NAME': os.environ['RDS_DB_NAME'], 'USER': os.environ['RDS_USERNAME'], 'PASSWORD': os.environ['RDS_PASSWORD'], 'HOST': os.environ['RDS_HOSTNAME'], 'PORT': os.environ['RDS_PORT'], } }
- 在
requirements.txt中添加对应数据库驱动,PostgreSQL添加psycopg2-binary,MySQL添加mysqlclient - 重新部署应用后,通过EBS控制台的eb ssh连接实例执行
python manage.py migrate完成表结构同步即可正常访问。
内容的提问来源于stack exchange,提问作者Faisal Memon
相关产品推荐
相关产品推荐

