【问题标题】:Properly install sqlite3 with FTS5 support正确安装支持 FTS5 的 sqlite3
【发布时间】:2018-03-16 19:59:45
【问题描述】:

我正在开发一个 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

但是,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 系统中都支持 sqlite3 FTS5 吗?
  2. 有没有办法将 python 模块 sqlite3 链接到特定的 sqlite3 路径?

我在 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

【问题讨论】:

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


    【解决方案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

    【讨论】:

    【解决方案2】:

    我认为是链接问题!我按照与您相同的安装步骤并得到了相同的结果:

    $ 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 并且 python 链接到正确的库。为此,您需要在您的ld.so.conf 某处拥有/usr/local/lib 文件夹......对我来说,这是在:

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

    【讨论】:

    【解决方案3】:

    感谢您对@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 docker 中进行了操作。在此过程中,我删除了 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
    

    【讨论】:

    • 我认为您在回答中混淆了我和@urban。对于解决方案,如果您不仅可以打包您在问题中所写的依赖项,而且可以将您的应用程序作为一个整体打包在一个容器中,那么这是一个很好的解决方案。也可能sudo 是多余的,因为您仍然是root,但您可以使用USER 设置一次,切换到权限较低的。
    • 好的,谢谢。设置 docker 后,sudo 用于安装程序。此外,第二部分对于非 docker 安装很有用,但是是的,我只能说“以 root 身份执行”。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-12-23
    • 1970-01-01
    • 1970-01-01
    • 2014-10-18
    • 2022-01-23
    • 2011-09-11
    • 1970-01-01
    相关资源
    最近更新 更多