python и sqlite3, проверьте, могу ли я использовать расширение fts5?

Недавно я узнал, что расширение FTS5 было выпущено.
Как лучше всего проверить, может ли мое приложение использовать его в системе пользователей?
Просто проверка версии python3 или проверка sqlite3.sqlite_version в соответствии со страницей выпуска?? Или что-то другое?

2 ответа

Решение

/ это было ранее редактирование поста OP, но я переместил его сюда, чтобы прояснить вопрос

так что похоже, что это может сработать, нашел это в вопросе здесь

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, либо не поддерживает ни то, ни другое.

В документации, на которую вы ссылаетесь, упоминается, что FTS5 по умолчанию отключен. Вы включили его при компиляции SQLite?

Один быстрый способ узнать это использовать peewee ОРМ:

from playhouse.sqlite_ext import FTS5Model
FTS5Model.fts5_installed()

Выше вернется True если вы можете использовать FTS5. Вы можете установить peewee с pip install peewee,

Вы также можете использовать apsw Обертка, которая включает FTS5 по умолчанию начиная с версии 3.11.0-r1. Смотрите инструкции по сборке и используйте --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
Другие вопросы по тегам