编写此文是因为在 Linux 上跑项目时报错:
sqlite3.NotSupportedError: deterministic=True requires SQLite 3.8.3 or highe(此时已经安装了 python3)。
sqlalchemy.exc.OperationalError: (sqlite3.OperationalError) near "(": syntax error
[SQL: SELECT anon_1.document_id AS anon_1_document_id
FROM (SELECT document.id AS document_id, row_number() OVER (ORDER BY document.id) AS rownum
FROM document) AS anon_1
WHERE rownum % 10000=1]
查询之后发现是因为 centos 上的 sqlite3 版本过低导致。
去验证一下:在 centos 上进入 python,可以看到 sqlite3 的版本为 3.7.17。
Python 3.8.12 (default, Jun 21 2019, 00:36:41)
[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.7.17'
>>> exit()
原因已经找到,下面开始执行。
首先去官网下载对应版本
官网 https://sqlite.org/download.html
(1)下载前需要建立一个文件夹,用于放置压缩包。此处选择 / home 为主目录,可以根据自身习惯更改下载存储地址。
mkdir /home/tools/sqlite3
(2)使用 wget 下载
到 SQLite 官网的下载页面:https://sqlite.org/download.html 这里是最新的版本。
step3: 选择下载版本则可
cd /home/tools/sqlite3 #切换到下载路径
wget https://www.sqlite.org/cgi/src/zip/0d1fc92f/SQLite-0d1fc92f.zip #执行下载
等待下载完毕即可
step4: 解压
unzip SQLite-0d1fc92f.zip
解压后可以看到有新的文件夹:SQLite-0d1fc92f,进入该目录进行 sqlite3 的编译和安装。
cd SQLite-0d1fc92f
mkdir /usr/local/sqlite3.42
./configure --prefix=/usr/local/sqlite3.42/
固定语法,‘–prefix’后接安装路径。结束时提示:Complete! 即可
make clean # 清除缓存
make && make install # 安装
提示:Successfully… 即可,否则清除缓存后,重新编译
以上述方式安装后,会把编译好的二进制文件安装到/usr/local/sqlite3.42/lib
, 把头文件sqlite3.h sqlite3ext.h
安装到/usr/local/sqlite3.42/include
,我们需要知道这两个路径。
cd /usr/bin # 切换到bin路径
ls -la sqlite* # 查看sqlite已经存在的软连接
若提示:ls: cannot access sqlite*: No such file or directory。则还未建立软连接,直接执行下面的代码,建立软连接即可
ln -s /usr/local/sqlite3.42/bin/sqlite3 /usr/bin/sqlite3
注:其中/usr/local/sqlite3.42/bin/sqlite3
为 sqlite3 的安装路径下的 bin 路径中的 sqlite3,/usr/bin/sqlite3
为固定位置
若显示
需要先删除该软连接,再新建
rm -rf sqlite3 # 删除
ln -s /usr/local/sqlite3.42/bin/sqlite3 /usr/bin/sqlite3 # 新建
ls -la sqlite* # 查看软连接
sqlite3 --version # 查看版本
python
import sqlite3
print(sqlite3.sqlite_version)
最终效果为
echo "/usr/local/sqlite3.42/lib" > /etc/ld.so.conf.d/sqlite3.conf
ldconfig
如果上述不行,
因为 sqlite3 是在 python3 安装时进行连接的,我的云服务器已经安装过了,所以需要卸载,如果还没有安装 python3 的,可以跳过这一步。
注:此处仅删除 python3,尽量别删除原装的 python2.7.5,因为 centos7 有一些命令是依赖 2.7.5 的。
whereis python3 |xargs rm -frv # 此为强制删除,也可以使用yum命令删除
下载方法和 sqlite3 的下载相似。本文安装的 python3.8.12 版本,官网地址为:https://www.python.org/ftp/python/3.8.12/
mkdir /home/tools/python3 # 新建下载存储路径
cd /home/tools/python3 # 切换到存储路径
wget https://www.python.org/ftp/python/3.8.12/Python-3.8.12.tar.xz # 使用wget直接下载
同样的,也可以在本地下载之后,通过 ftp 上传。
tar -zxvf Python-3.8.12.tgz # 解压
cd Python-3.8.12/
编译安装之前建议在 / usr/local 路径下建立安装路径(根据自身习惯选择)
mkdir /usr/local/python3
原本 python3 的编译为下面的方法,但是,没有加参数的默认安装,python 会自动导入原版本的 sqlite3.7.17,
cd /home/tools/python/Python-3.8.12/ # 切换到解压后的路径
./configure --prefix=/usr/local/python3 # 编译,‘--prefix’后接安装路径
make clean # 清除缓存
make && make install # 安装
将上述代码修改为:
cd /home/tools/python/Python-3.8.12/ # 切换到解压后的路径
# 编译,‘--prefix’后接安装路径,其中LD_RUN_PATH和LDFLAGS为sqlite3的二进制文件位置路径,CPPFLAGS是头文件的位置路径。上面安装sqlite3时已经提到。
LD_RUN_PATH=/usr/local/sqlite3.42/lib/ ./configure LDFLAGS="-L/usr/local/sqlite3.42/lib" CPPFLAGS="-I/usr/local/sqlite3.42/include" --prefix=/usr/local/python3/
LD_RUN_PATH=/usr/local/sqlite3.42/lib/ make # 编译时将sqlite3的二进制文件路径添加到动态链接库的搜索路径中
make clean # 清除缓存
make && make install # 安装
建立方法与 sqlite3 的软连接建立方式相同
ls -la python* # 查看python已存在的软连接
以上软连接不做更改(因为很多系统命令会依赖 python2.7),直接新建一个 python3 的软连接即可
ln -s /usr/local/python3/bin/python3 /usr/bin/python3
最终效果
至此,sqlite3 和 python3 已经安装并且连接好了,可进行如下验证
[root@iZf8z170cg4zcnds9u2p10Z bin]# python3 # 进入python3
Python 3.8.12 (default, Jun 5 2023, 16:00:05)
[GCC 4.8.5 20150623 (Red Hat 4.8.5-44)] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>> import sqlite3
>>> sqlite3.sqlite_version
'3.42.0'
>>>exit()
可以看到,其中 python 版本为 3.8.12,并且 python3 内的 sqlite3 版本为 3.42.0,升级成功
参考链接:
https://blog.csdn.net/TAYLOR1219070261/article/details/131064076
https://blog.csdn.net/u012940672/article/details/122452092