正确安装支持FTS5的sqlite3

时间:2018-03-01 15:38:03

标签: python linux sqlite full-text-search fts5

我正在开发一个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;一样得到:

COMPILER=gcc-5.4.0 20160609
ENABLE_DBSTAT_VTAB
ENABLE_FTS4
**ENABLE_FTS5**
ENABLE_JSON1
ENABLE_RTREE
ENABLE_STMTVTAB
ENABLE_UNKNOWN_SQL_FUNCTION
HAVE_ISNAN
THREADSAFE=1

但是,使用this script的python版本会返回:

[(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系统中使用sqlite3 FTS5支持?
  2. 有没有办法将python模块sqlite3链接到特定的     sqlite3路径?
  3. 我在Ubuntu 16.04 LTS中尝试了所有这些,但我想在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
    

3 个答案:

答案 0 :(得分:1)

简单的方法是使用apsw(另一个Python SQLite Wrapper)。它的API与sqlite3略有不同,你不能只是pip-install它(除非你的版本已经过时),但其余的都很好,你可以拥有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

然后,

import apsw

apsw.Connection(':memory:').cursor().execute('pragma compile_options').fetchall()

返回:

[('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',)]

困难的方法是使用自定义SQLite编译Python。 this article by Charles Leifer中的更多细节。

答案 1 :(得分:1)

我认为是一个链接问题!我跟着你做了相同的安装步骤并得到了相同的结果:

$ 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 / make install安装某些内容时,它通常会进入/usr/local/lib。为了确保python在运行时链接到我使用.so的正确LD_LIBRARY_PATH。在这种情况下,我得到了:

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

此外,在安装库时,您可能需要更新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和针对正确的lib的python链接。要做到这一点,您需要在/usr/local/lib某个地方设置ld.so.conf文件夹...对我来说这是:

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

答案 2 :(得分:1)

感谢您的回答@urban@saaj。我发现你的答案很有建设性。

我看到@saaj回答的问题是它需要额外的包,特别是apsw包,例如与pypy不兼容。我无法让它发挥作用,但可能是我的错。

我真的很喜欢@urban的回答。我做了这个过程并让它运转起来。我把这个答案标记为正确。

但是我想补充一下自己的答案。相当激进,但它对我有用。我使用以下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码头工作室里做了。在这个过程中,我删除了sqlite3并安装了它在following article中找到的依赖项。之后我重新安装了python。

sudo apt-get update -y
echo "[ - Removing sqlite3... ]"
sudo apt-get remove -y sqlite3
sudo apt-get purge -y sqlite3
echo "[ - Installing sqlite3 dependencies... ]"
sudo apt-get install -y build-essential bzip2 git libbz2-dev libc6-dev libgdbm-dev libgeos-dev liblz-dev liblzma-dev libncurses5-dev libncursesw5-dev libreadline6 libreadline6-dev libsqlite3-dev libssl-dev lzma-dev python-dev python-pip python-software-properties python-virtualenv software-properties-common sqlite3 tcl tk-dev tk8.5-dev wget
echo "[ - Installing sqlite3... ]"
sudo wget "https://www.sqlite.org/src/tarball/sqlite.tar.gz?r=release" -O sqlite.tar.gz &> /dev/null
sudo tar -xzvf sqlite.tar.gz
cd sqlite
sudo ./configure --enable-fts5
sudo make
sudo make install
cd ..
echo "[ - Reinstalling python... ]"
sudo apt-get remove -y python python3 python-dev
sudo apt-get install -y --reinstall python2.7 python3 python-dev
sudo apt-get install -y build-essential bzip2 git libbz2-dev libc6-dev libgdbm-dev libgeos-dev liblz-dev liblzma-dev libncurses5-dev libncursesw5-dev libreadline6 libreadline6-dev libsqlite3-dev libssl-dev lzma-dev python-dev python-pip python-software-properties python-virtualenv software-properties-common sqlite3 tcl tk-dev tk8.5-dev wget