Django启动报错:Apache日志提示SQLite 3.9.0+版本不足但命令行版本正常
版本不一致的根本原因
你在命令行测试时的运行环境和Apache下mod_wsgi的运行环境是完全隔离的,出现版本差别的核心原因有两个:
- 你手动编译Python时,已经将编译参数指定为链接你自己安装的新版SQLite(3.36.0),且你当前登录用户的shell环境中
LD_LIBRARY_PATH包含了新版SQLite的库文件路径,所以命令行下Python能正确读取到新版版本号。 - Apache进程的运行环境是独立的,默认只会加载系统自带的动态链接库,你用的CentOS/RHEL7类系统默认自带的SQLite版本就是3.7.17,mod_wsgi运行时加载的是系统自带的旧版SQLite动态库,就会出现Apache日志里检测到旧版本的问题。
解决方法
你可以任选以下一种方案处理:
- 方案1:修改Apache环境变量,指定新版SQLite库路径
如果你是通过yum等系统包管理器安装的mod_wsgi,不需要重新编译模块,直接修改Apache配置:- 编辑httpd.conf或者你的站点虚拟主机配置文件,添加一行配置:
SetEnv LD_LIBRARY_PATH /你的新版SQLite库文件所在路径(通常是/usr/local/sqlite3/lib)- 如果你使用systemd管理Apache服务,还需要编辑
/usr/lib/systemd/system/httpd.service文件,在[Service]段添加:
Environment="LD_LIBRARY_PATH=/你的新版SQLite库文件所在路径"- 执行
systemctl daemon-reload && systemctl restart httpd重启服务生效。
- 方案2:替换Django默认的SQLite驱动
不需要修改系统和Apache配置,直接在项目层面替换驱动即可:- 激活项目虚拟环境,安装pysqlite3:
pip install pysqlite3 pysqlite3-binary- 打开Django项目根目录的
__init__.py文件,添加以下代码:
import pysqlite3 import sys sys.modules['sqlite3'] = pysqlite3- 重启Apache即可生效,Django会直接调用pysqlite3内置的新版SQLite。
- 方案3:重新编译mod_wsgi
编译时指定对应Python版本和新版SQLite路径:
编译完成后替换Apache原来加载的mod_wsgi.so文件,重启Apache即可。./configure --with-python=/你的Python3.7可执行文件路径 LDFLAGS="-L/你的新版SQLite库路径" CPPFLAGS="-I/你的新版SQLite头文件路径" make && make install - 方案4:生产环境建议直接更换数据库为MySQL或PostgreSQL,从根本上避免SQLite的兼容性、并发性能等问题。
内容的提问来源于stack exchange,提问作者Rafiq Shaikh
相关产品推荐
相关产品推荐

