我们需要使用一些最新的 sqlite 功能,例如“UPDATE FROM”,该功能可从 sqlite 3.33.0 开始使用(https://www.sqlite.org/changes.html)。
在当前的 debian docker 镜像中,我们使用稳定(buster)发行版,它具有旧版本的 sqlite lib(名称为 libsqlite3-dev)。
我从 .sh 脚本中的源代码在本地编译了 sqlite3,但我无法配置 python sqlite3 模块以使用刚刚编译的 sqlite 版本。
代码如下所示:
# Download newer libsqlite3-dev with "UPDATE FROM" clause support
cd data_processing
wget "https://www.sqlite.org/2020/sqlite-amalgamation-3340000.zip" -O sqlite.zip
unzip sqlite.zip
rm sqlite.zip
mv sqlite-amalgamation-3340000 sqlite-3.34
cd sqlite-3.34
gcc shell.c sqlite3.c -lpthread -ldl -o sqlite3
# remove no longer needed file (everything else than just created sqlite3)
find . ! -name 'sqlite3' -type f -exec rm -f {} +
cd -
export PATH="$(pwd)/my_app/sqlite-3.34:$PATH"
在这里我们可以看到,将二进制文件添加到路径中是不够的。 我也尝试添加:
sys.path.insert(
0,
'/home/user/project/libs/my_app/sqlite-3.34'
)
写入python代码,没有成功。 有没有办法配置 sqlite3 python 模块以使用系统上安装的不同 sqlite 库?
添加到上面的答案(没有足够的代表)
import sys
sys.modules['sqlite3'] = __import__('pysqlite3')
交换系统 sqlite3 的二进制文件
使用pysqlite3的二进制包: https://github.com/coleifer/pysqlite3 在您的要求中,添加
pip install pysqlite3-binary
在Python代码中,使用pysqlite3:
import pysqlite3
(...) conn = pysqlite3.connect(r"filename") (...)
而不是sqlite3。
替代方案,正如安东尼建议的那样:交换系统二进制文件 您可以交换系统的二进制文件:
import sys
sys.modules['sqlite3'] = __import__('pysqlite3')
然后,您不必在代码中使用
pysqlite3
。