简体   繁体   中英

python and sqlite3, check if I can use fts5 extension?

I recently found out that FTS5 extension has been released.
What is the best way to check if my application can use it on users system?
Just python3 version check, or sqlite3.sqlite_version check according to release page ?? Or something else?

/ this was previously edit of the OP post, but I moved it down here to keep the question clear

so this feels like it could work, found it in the question here

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

But what is strange is that I run it in a few virtual machines, and none had fts4 enabled, yet I used it happily like nothing... maybe its fts3/fts4 being rather the same, or maybe its just all wrong.

/edit
from the documentation

Note that enabling FTS3 also makes FTS4 available. There is not a separate SQLITE_ENABLE_FTS4 compile-time option. A build of SQLite either supports both FTS3 and FTS4 or it supports neither.

The documentation you link to mentions that FTS5 is disabled by default. Did you enable it when compiling SQLite?

One quick way to know is to use the peewee ORM :

from playhouse.sqlite_ext import FTS5Model
FTS5Model.fts5_installed()

The above will return True if you can use FTS5. You can install peewee with pip install peewee .

You could also use the apsw wrapper, which includes FTS5 by default since version 3.11.0-r1 . See the build instructions and use the --enable-all-extensions flag. The apsw wrapper uses the amalgamation .

EDIT: Here is the code from the peewee source demonstrating how this is done:

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

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM