正确安装带FTS5 supp的sqlite3

2024-09-24 02:26:53 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在开发一个Python工具,它使用带有FTS5(全文搜索)的sqlite3虚拟表。我想知道如何从tarball(或任何其他方式)正确安装我的工具所需的要求,以便我可以打包,以便于携带。在

目前,我成功地安装了latest release tarball of sqlite。但是,当我执行以下操作时:

python3 -c "import sqlite3; print(sqlite3.sqlite_version)"
# or
python2 -c "import sqlite3; print(sqlite3.sqlite_version)"

我得到3.11.0,而sqlite3 --version返回:3.22.0 2018-01-22 18:45:57 0c55d179733b46d8d0ba4d88e01a25e10677046ee3da1d5b1581e86726f2alt1

系统版本sqlite3 3.22确实支持FTS5,就像我一样pragma compile_options;并得到:

^{pr2}$

但是,python版本使用this script返回以下内容:

[(u'ENABLE_COLUMN_METADATA',), (u'ENABLE_DBSTAT_VTAB',), (u'ENABLE_FTS3',), (u'ENABLE_FTS3_PARENTHESIS',), (u'ENABLE_JSON1',), (u'ENABLE_LOAD_EXTENSION',), (u'ENABLE_RTREE',), (u'ENABLE_UNLOCK_NOTIFY',), (u'ENABLE_UPDATE_DELETE_LIMIT',), (u'HAVE_ISNAN',), (u'LIKE_DOESNT_MATCH_BLOBS',), (u'MAX_SCHEMA_RETRY=25',), (u'OMIT_LOOKASIDE',), (u'SECURE_DELETE',), (u'SOUNDEX',), (u'SYSTEM_MALLOC',), (u'TEMP_STORE=1',), (u'THREADSAFE=1',)]

因此,我的问题是

  1. 我有没有办法为我的应用程序制作一个linux便携包 在python和linux系统中都支持sqlite3fts5吗?在
  2. 有没有办法将python模块sqlite3链接到特定的 sqlite3路径?在

我在Ubuntu16.04LTS上尝试了所有这些,但我也希望在CentOS 7上也能工作。在

事先非常感谢。在

关于我做的tarball安装的更多细节:

wget "https://www.sqlite.org/src/tarball/sqlite.tar.gz?r=release" -O sqlite.tar.gz
tar -xzvf sqlite.tar.gz
cd sqlite
./configure --enable-fts5
make
sudo make install

Tags: 工具import版本sqlitereleaseenableversion系统
3条回答

感谢您的回答@urban和{a2}。我觉得你的回答很有建设性。在

我认为@saaj的问题是它需要额外的包,特别是apsw包,这与pypypy不兼容。我无法使它成功,但可能是我的错。在

我真的很喜欢“城市回答”。我做了这个过程,让它工作。我把这个答案标为正确。在

不过,我想补充我自己的答案。很有攻击性,但对我有效。我用以下Dockerfile创建了一个Ubuntu docker:

FROM ubuntu:16.04
RUN apt-get update -y
RUN DEBIAN_FRONTEND=noninteractive DEBCONF_NONINTERACTIVE_SEEN=true apt-get install -y apt-utils tzdata
RUN DEBIAN_FRONTEND=noninteractive DEBCONF_NONINTERACTIVE_SEEN=true dpkg-reconfigure tzdata
RUN echo "Europe/Berlin" > /etc/timezone
RUN dpkg-reconfigure -f noninteractive tzdata
RUN apt-get update -y
RUN apt-get install -y git build-essential sudo

后来,我在Ubuntu docker里面做了。在这个过程中,我删除了sqlite3并安装了它的依赖项,这是我在following article中找到的。后来我重新安装了python。在

^{pr2}$

我认为这是一个连接问题!我按照与您相同的安装步骤,得到了相同的结果:

$ python ./test.py 
[(u'ENABLE_COLUMN_METADATA',), (u'ENABLE_FTS3',), (u'ENABLE_RTREE',), (u'ENABLE_UNLOCK_NOTIFY',), (u'ENABLE_UPDATE_DELETE_LIMIT',), (u'MAX_SCHEMA_RETRY=25',), (u'OMIT_LOOKASIDE',), (u'SECURE_DELETE',), (u'SOUNDEX',), (u'SYSTEM_MALLOC',), (u'TEMP_STORE=1',), (u'THREADSAFE=1',)]
NO

但是,当您在Linux上通过configure/make/makeinstall安装某些东西时,它通常在/usr/local/lib中进行。为了确保运行时的python链接指向正确的.so,我使用了LD_LIBRARY_PATH。在这种情况下,我得到:

^{pr2}$

另外,在安装库时,您可能需要更新ldconfig。在我的系统上(Ubuntu 14.04):

$ sudo ldconfig
$ python ./test.py 
[(u'COMPILER=gcc-4.8.5',), (u'ENABLE_FTS5',), (u'HAVE_ISNAN',), (u'TEMP_STORE=1',), (u'THREADSAFE=1',)]
YES

请注意,不再需要使用LD_LIBRARY_PATH,并且python链接指向正确的lib。要实现这一点,您需要在您的ld.so.conf中的某个地方有/usr/local/lib文件夹。。。对我来说这是在:

$ grep -ir local /etc/ld.so.conf.d/
/etc/ld.so.conf.d/libc.conf:/usr/local/lib

简单的方法是使用^{}(另一个pythonsqlite包装器)。它的API与sqlite3只是有点不同,你不能只是pip安装它(除非你对过时的版本没意见),但其余的都很好,你可以拥有SQLite最新的特性。在

wget https://github.com/rogerbinns/apsw/releases/download/3.22.0-r1/apsw-3.22.0-r1.zip
unzip apsw-3.22.0-r1.zip
cd apsw-3.22.0-r1
python setup.py fetch  sqlite build  enable-all-extensions install

然后

^{pr2}$

退货:

[('COMPILER=gcc-5.4.0 20160609',),
 ('ENABLE_API_ARMOR',),
 ('ENABLE_FTS3',),
 ('ENABLE_FTS3_PARENTHESIS',),
 ('ENABLE_FTS4',),
 ('ENABLE_FTS5',), 
 ('ENABLE_ICU',),
 ('ENABLE_JSON1',),
 ('ENABLE_RBU',),
 ('ENABLE_RTREE',),
 ('ENABLE_STAT4',),
 ('THREADSAFE=1',)]

用Python定制编译是很困难的。更多细节请参见this article by Charles Leifer。在

相关问题 更多 >