如何在 Ubuntu 16.04 上将 FTS5 扩展与带有 Python 3.7 的 sqlite3 python 模块一起使用?

Posted

技术标签:

【中文标题】如何在 Ubuntu 16.04 上将 FTS5 扩展与带有 Python 3.7 的 sqlite3 python 模块一起使用?【英文标题】:How can I use the FTS5 extension with the sqlite3 python module with Python 3.7 on Ubuntu 16.04? 【发布时间】:2020-02-16 08:42:43 【问题描述】:

为了测试带有 sqlite3 Python 模块的 FTS5 扩展是否有效,我使用来自 Vorsprung durch Technik 的 code:

import sqlite3     
conn = sqlite3.connect(':memory:')
conn.execute("""create virtual table fts5test using fts5 (data);""") 
conn.execute("""insert into fts5test (data) 
                values ('this is a test of full-text search');""")
conn.execute("""select * from fts5test where data match 'full';""").fetchall() 

代码在 Ubuntu 18.04 和 Ubuntu 19.04 上运行良好。例如,可以使用以下 python3.7 解释器通过 Docker 运行它:

docker pull ubuntu:18.04 # This line is optional.
docker run --interactive --tty ubuntu:18.04 bash
apt update
apt install -y software-properties-common
add-apt-repository -y ppa:deadsnakes/ppa
apt update 
apt install -y python3.7
python3.7
# use here the python code given above 

但是,如果我将 Ubuntu 版本从 18.04 更改为 16.04,则 FTS5 扩展将不起作用:

docker pull ubuntu:16.04 # This line is optional.
docker run --interactive --tty ubuntu:16.04 bash
apt update
apt install -y software-properties-common
add-apt-repository -y ppa:deadsnakes/ppa
apt update 
apt install -y python3.7
python3.7
# use here the python code given above 

python代码会崩溃:

[GCC 5.4.0 20160609] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>> import sqlite3
>>> conn = sqlite3.connect(':memory:')
>>> conn.execute("""create virtual table fts5test using fts5 (data);""")
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
sqlite3.OperationalError: no such module: fts5

如何在 Ubuntu 16.04 上将 FTS5 扩展与 sqlite3 Python 模块与 Python 3.7 一起使用?

【问题讨论】:

【参考方案1】:

这两篇文章(Force Python to forego native sqlite3 and use the (installed) latest sqlite3 version 和 http://charlesleifer.com/blog/using-the-sqlite-json1-and-fts5-extensions-with-python/)可以解决这个问题。

试试这些步骤:

    下载 SQLite 源代码并在启用 FTS5 的情况下构建它。

    $ wget https://www.sqlite.org/2020/sqlite-autoconf-3310100.tar.gz
    $ tar xvzf sqlite-autoconf-3310100.tar.gz
    $ cd sqlite-autoconf-3310100
    $ CFLAGS="-DSQLITE_ENABLE_FTS5" ./configure
    $ make sqlite3.c
    

    在继续之前,您可能需要激活您的虚拟环境。

    $ source <path to Python3.7 virtual environment>/bin/activate
    (python37env) $
    

    本文作者 (http://charlesleifer.com/blog/using-the-sqlite-json1-and-fts5-extensions-with-python/) 将 Python 3 中的 SQLite3 DB-API 2.0 驱动程序作为一个单独的包 (enter link description here)。所以你可以用它来替换原来的驱动。

    (python37env) $ wget https://github.com/coleifer/pysqlite3/archive/0.4.2.tar.gz
    (python37env) $ tar xvzf 0.4.2.tar.gz
    (python37env) $ cd pysqlite3-0.4.2
    (python37env) $ cp <path to sqlite-autoconf-3310100>/sqlite3.h .
    (python37env) $ cp <path to sqlite-autoconf-3310100>/sqlite3.c .
    (python37env) $ python setup.py build_static build
    (python37env) $ python setup.py install
    

    现在,应该将单独的 pysqlite 模块安装到您的虚拟环境中。

    测试一下。不要使用import sqlite3 来导入pysqlite3 模块,而是使用from pysqlite3 import dbapi2 as sqlite3。这将从自定义 pysqlite 模块导入 SQLite3 DB-API 2.0 驱动程序。您的测试代码将如下所示:

    # import sqlite3
    from pysqlite3 import dbapi2 as sqlite3
    
    conn = sqlite3.connect(':memory:')
    conn.execute("""create virtual table fts5test using fts5 (data);""")
    conn.execute("""insert into fts5test (data)
                    values ('this is a test of full-text search');""")
    conn.execute("""select * from fts5test where data match 'full';""").fetchall()
    

此方法适用于我的带有 Python 3.7.3 的 Ubuntu 16.04 VM。

【讨论】:

以上是关于如何在 Ubuntu 16.04 上将 FTS5 扩展与带有 Python 3.7 的 sqlite3 python 模块一起使用?的主要内容,如果未能解决你的问题,请参考以下文章

如何在Ubuntu 16.04上将Redis服务器设置为PHP的会话处理程序

在 ubuntu 16.04 LTS 上运行 mongodb

在 Ubuntu Server 上将 .R 文件转换为实际的 Shiny 应用程序

无法在 Ubuntu 16.04 lts 上运行的 apache 2.4.18 服务器上设置 X-Frame 选项

如何在 Peewee 和 SQLite 的 FTS5 中使用 trigram tokenizer/similarity 选项?

如何查找 FTS5 和 MATCH 之间的记录?