Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

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?

like image 819
DoTheEvo Avatar asked Apr 15 '16 19:04

DoTheEvo


2 Answers

/ 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.

like image 177
DoTheEvo Avatar answered Oct 23 '22 09:10

DoTheEvo


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
like image 4
ChrisP Avatar answered Oct 23 '22 07:10

ChrisP