python 和 sqlite3,检查我是否可以使用 fts5 扩展?

问题描述 投票:0回答:2

我最近发现FTS5扩展已经发布了。
检查我的应用程序是否可以在用户系统上使用它的最佳方法是什么?
只需检查python3版本,或者根据发布页面检查sqlite3.sqlite_version?还是别的什么?

python sqlite full-text-search fts5
2个回答
13
投票

这感觉好像可以工作,在 Using SQLite's FTS3/4 with Python 3

中找到它
import sqlite3

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

print(available_pragmas)

if ('ENABLE_FTS5',) in available_pragmas:
    print('YES')
else:
    print('NO')

我在几个虚拟机中运行它,没有一个虚拟机启用了 fts4,但我却像什么都没有一样愉快地使用它。来自文档:

请注意,启用 FTS3 也会使 FTS4 可用。没有单独的 SQLITE_ENABLE_FTS4 编译时选项。 SQLite 的构建要么同时支持 FTS3 和 FTS4,要么两者都不支持。


4
投票

您链接到的文档提到 FTS5 默认情况下处于禁用状态。你编译SQLite的时候启用了吗?

一种快速了解的方法是使用

peewee
ORM:

from playhouse.sqlite_ext import FTS5Model
FTS5Model.fts5_installed()

如果您可以使用FTS5,上面将返回

True
。您可以使用
peewee
安装
pip install peewee

您还可以使用

apsw
包装器,它 自版本 3.11.0-r1 起默认包含 FTS5。请参阅 构建说明 并使用
--enable-all-extensions
标志。
apsw
包装器使用 合并

编辑: 以下是来自

peewee
来源的代码,演示了这是如何完成的:

def fts5_installed(cls):
    if sqlite3.sqlite_version_info[:3] < FTS5_MIN_VERSION:
        return False

    # Test in-memory DB to determine if the FTS5 extension is installed.
    tmp_db = sqlite3.connect(':memory:')
    try:
        tmp_db.execute('CREATE VIRTUAL TABLE fts5test USING fts5 (data);')
    except:
        try:
            sqlite3.enable_load_extension(True)
            sqlite3.load_extension('fts5')
        except:
            return False
        else:
            cls._meta.database.load_extension('fts5')
    finally:
        tmp_db.close()

    return True
© www.soinside.com 2019 - 2024. All rights reserved.