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

时间:2016-04-15 19:53:41

标签: python sqlite full-text-search fts5

我最近发现已发布FTS5扩展程序 检查我的应用程序是否可以在用户系统上使用它的最佳方法是什么? 只是python3版本检查,或根据release page sqlite3.sqlite_version检查?或其他什么?

2 个答案:

答案 0 :(得分:4)

/这是之前编辑的OP帖子,但我把它移到这里以保持问题清晰

所以感觉它可以起作用,在问题looking up

中找到它
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相同,或者它可能只是错误

<强> /修改
来自文档

  

请注意,启用FTS3也可以使FTS4可用。没有单独的SQLITE_ENABLE_FTS4编译时选项。 SQLite的版本既支持FTS3又支持FTS4,或者它都不支持。

答案 1 :(得分:3)

您链接的文档提到默认情况下禁用FTS5。你在编译SQLite时是否启用了它?

一种快速了解方法是使用peewee ORM

from playhouse.sqlite_ext import FTS5Model
FTS5Model.fts5_installed()

如果您可以使用FTS5,上面的内容将返回True。您可以使用peewee安装pip install peewee

您还可以使用apsw包装,includes FTS5 by default since version 3.11.0-r1。请参阅build instructions并使用--enable-all-extensions标志。 apsw包装使用amalgamation

修改 以下是peewee source中的代码,演示了如何完成此操作:

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