如何使用带有 Python 3.7 的 sqlite3 python 模块的 FTS5 扩展?

Posted

技术标签:

【中文标题】如何使用带有 Python 3.7 的 sqlite3 python 模块的 FTS5 扩展?【英文标题】:How can I use the FTS5 extension with the sqlite3 python module with Python 3.7? 【发布时间】:2020-02-16 02:48:42 【问题描述】:

如何在 Python 3.7 中使用 FTS5 扩展和 sqlite3 python 模块?

我尝试使用python testFTS5.py 在 Python 中运行以下代码:

import sqlite3
conn = sqlite.connect('some_db.db')
sqlite.enable_load_extension(True)
sqlite.load_extension('fts5') 

导致错误消息:

Traceback (most recent call last):
  File "./src/test.py", line 3, in <module>
    sqlite.enable_load_extension(True)
AttributeError: module 'sqlite3' has no attribute 'enable_load_extension'

我尝试了sqlite.load_extension('FTS5')sqlite.load_extension('ENABLE_FTS5'),但不出所料地产生了相同的错误消息(未找到相应的文件名)。我还尝试使用LD_LIBRARY_PATH=/usr/local/bin python testFTS5.py 运行代码,但我收到了相同的错误消息。

我通过在终端中运行以下代码检查了sqlite3 位置:

derno@ompn:/mnt/ilcompn0d1/user/dernonco/fts-test$ which sqlite3
/usr/local/bin/sqlite3

我列出了已安装的sqlite3 扩展:

derno@ompn:/mnt/ilcompn0d1/user/dernonco/fts-test$ sqlite3
SQLite version 3.18.0 2017-03-28 18:48:43
Enter ".help" for usage hints.
Connected to a transient in-memory database.
Use ".open FILENAME" to reopen on a persistent database.
sqlite> pragma compile_options;
COMPILER=gcc-5.4.0 20160609
DEFAULT_SYNCHRONOUS=2
DEFAULT_WAL_SYNCHRONOUS=2
ENABLE_FTS5
ENABLE_RTREE
SYSTEM_MALLOC
THREADSAFE=1

这似乎表明 FTS5 在我的/usr/local/bin/sqlite3 版本中可用。

但是当我跑步时

import sqlite3

con = sqlite3.connect(':memory:')
cur = con.cursor()
cur.execute('pragma compile_options;')
available_pragmas = cur.fetchall()
con.close()

print(available_pragmas)

它输出:

[('COMPILER=gcc-5.4.0 20160609',), ('DEFAULT_SYNCHRONOUS=2',), ('DEFAULT_WAL_SYNCHRONOUS=2',), 
('ENABLE_FTS3',), ('ENABLE_RTREE',), ('SYSTEM_MALLOC',), ('THREADSAFE=1',)]

该列表中没有ENABLE_FTS5

我尝试使用 Python 3.7.6(默认,2019 年 12 月 19 日,23:49:42)和 Python 3.6.7(默认,2018 年 10 月 25 日,09:16:13)。

【问题讨论】:

conn而不是模块上调用.enable_load_extension(True).load_extension('fts5') @VorsprungdurchTechnik 哎呀,谢谢!抱歉 code I was following 显然有错字,或者是 sqlite3 的早期版本。您的评论解决了这个问题。欢迎您将您的评论转换为答案。我现在在运行conn.load_extension('fts5') 时面临sqlite3.OperationalError: fts5.so: cannot open shared object file: No such file or directory,现在我正试图理解(我以为我的sqlite3 版本有ENABLE_FTS5 但也许sqlite3 python 包不使用/usr/local/bin/sqlite3?),想法欢迎! @VorsprungdurchTechnik 非常感谢,您的意思是编译sqlite3 Python 包还是编译sqlite3 /usr/local/bin 中的二进制文件?如果是后者,它似乎支持我这边的 FTS5(当我运行 sqlite&gt; pragma compile_options; 时它显示 ENABLE_FTS5)。 是的,没关系。我认为它是支持的。我现在正在尝试拼凑一个示例来测试它是否对我有用。 【参考方案1】:

您可以在连接对象上调用.enable_load_extension(True).load_extension('fts5'),而不是在模块上。

但是,这不是必需的,因为 - 正如您所看到的 - 您的安装支持全文搜索。

您可以通过以下方式对其进行测试以确保:

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() 

结果:

In [67]: conn.execute("""select * from fts5test where data match 'full';""").fetchall()
Out[67]: [('this is a test of full-text search',)]

【讨论】:

谢谢,有趣的是,当我运行你的代码时,我得到sqlite3.OperationalError: no such module: fts5,当我运行 `conn.execute("""create virtual table fts5test using fts5 (data);""") . Do you use the default sqlite3` 安装包自带的python包?如果是的话,你用的是哪个版本的python? 我用的是Python自带的默认版本的sqlite3,是的。我正在运行 Python 3.8.0 和 3.6.9...让我现在在 3.6.9 上进行测试。 谢谢,python -c "import sqlite3; print(sqlite3.sqlite_version)" 的输出是什么(我有 3.18.0),你知道how can I see which sqlite3 binary does the sqlite3 Python module use on Ubuntu 16.04? 好的,问题来自 Ubuntu 16.04(在 Ubuntu 18.04 上一切看起来都很好),所以我打开了一个针对它的问题How can I use the FTS5 extension with the sqlite3 python module with Python 3.7 on Ubuntu 16.04?,并使用可重现的 docker+code(你的)显示了问题。 啊,谢谢你通知我。我确实在运行 Ubuntu 18.04。我希望你能得到 16.04 问题的答案。【参考方案2】:

我遇到的在 FTS5 中使用 sqlite enable 的最简单方法是在 conda 环境中使用 python。默认情况下,sqlite 会编译并安装最新版本。

您可以执行以下操作(在您的终端上):

# create a conda environment py_env
conda create -n py_env python=3.7

# activate your environment
conda activate py_env

现在,您需要做的就是从这个环境启动 python 以使用 sqlite3。

【讨论】:

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

Anaconda 总是安装 Python 3.7

Python与sqlit数据库--简单介绍

python 3.7 urllib.request 不遵循重定向 URL

(Python 3.7)如何使用 tkinter 打印消息字符之间有延迟?

如何获得 Python 3.7 新的数据类字段类型?

使用 cx_Freeze 冻结 Python 3.7 脚本时如何修复错误