如何使用带有 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> 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 扩展?的主要内容,如果未能解决你的问题,请参考以下文章
python 3.7 urllib.request 不遵循重定向 URL