在CentOS7中升级sqlite3,以及Django的sqlite配置
系统自带的sqlite3版本过低,在某些情况下,例如使用django时,需要进行升级。
请看完使用一节再操作,将对使用中可能遇到的问题进行说明,并且有一个适用于Django的简单方法
环境
- 操作系统:CentOS7
- Python安装方式:pyenv
- Python版本:3.8.5
编译
前往 sqlite官网下载最新版
类似:Source Code -> sqlite-autoconf-3320300.tar.gz
注意下载历史版本时需要登录,可以使用匿名身份登录。
tar xzvf sqlite-autoconf-3320300.tar.gz
mkdir bld
cd bld
../sqlite-autoconf-3320300/configure --prefix=/usr/local/sqlite
make
make install
安装
通过软连接的方式进行安装。
$ whereis sqlite3
sqlite3: /usr/bin/sqlite3 /usr/include/sqlite3.h /usr/share/man/man1/sqlite3.1.gz
$ sudo mv /usr/bin/sqlite3 /usr/bin/sqlite3.old
$ sudo mv /usr/include/sqlite3.h /usr/include/sqlite3.h.old
$ sudo mv /usr/share/man/man1/sqlite3.1.gz /usr/share/man/man1/sqlite3.1.gz.old
$ sudo ln -s /usr/local/sqlite/bin/sqlite3 /usr/bin/sqlite3
$ sudo ln -s /usr/local/sqlite/include/sqlite3.h /usr/include/sqlite3.h
$ sudo ln -s /usr/local/sqlite/share/man/man1/sqlite3.1 /usr/share/man/man1/sqlite3.1
# 指定额外的共享库路径
$ cat >> ~/.bashrc << EOF
>
> export LD_LIBRARY_PATH="/usr/local/sqlite/lib" # Specify additional Shared libraries
> EOF
$ whereis sqlite3
sqlite3: /usr/bin/sqlite3 /usr/bin/sqlite3.old /usr/include/sqlite3.h /usr/share/man/man1/sqlite3.1
# 验证
$ sqlite3 -version
3.32.3 2020-06-18 14:00:33 7ebdfa80be8e8e73324b8d66b3460222eb74c7e9dfd655b48d6ca7e1933cc8fd
# 验证
$ python
Python 3.8.5 (default, Aug 8 2020, 10:38:57)
[GCC 4.8.5 20150623 (Red Hat 4.8.5-36)] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>> import sqlite3
>>> sqlite3.sqlite_version
'3.32.3'
使用
操作系统中的sqlite完成升级后,在操作系统与py命令行中均能获取到升级后的版本,但是在某些py应用中仍然引发异常,以django为例,在升级之前提示获取到了不符合版本要求的sqlite,升级之后由一个不能被支持的参数引发NotSupportError,说明django虽然获取到了>=3.8.3版本的sqlite,但是部分方法仍然不能支持新特性,仍然使用<3.8.3版本的接口,这是因为虽然操作系统安装了新版本的sqlite,但是py内置的关于sqlite的动态链接库.so文件并未更新(.pyenv/versions/3.8.5/lib/python3.8/sqlite3/dbapi2.py调用.pyenv/versions/3.8.5/lib/python3.8/lib-dynload/_sqlite3.cpython-38-x86_64-linux-gnu.so),此时需要重新编译py,生成新的动态链接库文件,在使用pyenv管理py时卸载后重新安装即可,这里可能还有一个需要注意的问题(根据以上行为推测,使用编译py的方式,在py命令行中导入的sqlite3版本始终跟随操作系统中sqlite3版本),py的发行版中,windows、macos版内置了完整的sqlite,而linux版在安装时需要调用操作系统中sqlite版相关的内容,编译后的动态链接库中仍然调用操作系统的sqlie程序,与操作系统存在依赖,下面将说明一个非常简单的解决办法,以避免编译带来的麻烦。
在自己的py项目中,如果需要更高版本的sqlite,可以使用pysqlite3pip install pysqlite3项目编译指定版本的sqlite或使用内置已编译较新版本sqlite的pysqlite3-binarypip install pysqlite3-binary,程序中使用pysqlite3引入from pysqlite3 import dbapi2,从而不必更新操作系统sqlite3和重新编译py(pysqlite3将sqlite3版本与操作系统解耦)。据此也可解决django的问题,即在django中引入Database的地方进行如下修改:
编辑venv/lib/python3.8/site-packages/django/db/backends/sqlite3/base.py
#from sqlite3 import dbapi2 as Database
from pysqlite3 import dbapi2 as Database # 使用pysqlite3

浙公网安备 33010602011771号