Как я могу использовать расширение FTS5 с модулем sqlite3 python с Python 3.7? - PullRequest
0 голосов
/ 16 февраля 2020

Как использовать расширение FTS5 с модулем sqlite3 python с Python 3.7?

Я попытался запустить следующий код в Python с python testFTS5.py:

import sqlite3
conn = sqlite.connect('some_db.db')
sqlite.enable_load_extension(True)
sqlite.load_extension('fts5') 

, что приводит к сообщению об ошибке:

Traceback (most recent call last):
  File "./src/test.py", line 3, in <module>
    sqlite.enable_load_extension(True)
AttributeError: module 'sqlite3' has no attribute 'enable_load_extension'

Я попытался sqlite.load_extension('FTS5') и sqlite.load_extension('ENABLE_FTS5'), но неудивительно, что выдает то же сообщение об ошибке (соответствующее имя файла не найдено) , Я также попытался запустить код с LD_LIBRARY_PATH=/usr/local/bin python testFTS5.py, но получаю то же сообщение об ошибке.

Я проверил местоположение sqlite3, запустив в терминале следующий код:

derno@ompn:/mnt/ilcompn0d1/user/dernonco/fts-test$ which sqlite3
/usr/local/bin/sqlite3

и перечислил установленные sqlite3 расширения:

derno@ompn:/mnt/ilcompn0d1/user/dernonco/fts-test$ sqlite3
SQLite version 3.18.0 2017-03-28 18:48:43
Enter ".help" for usage hints.
Connected to a transient in-memory database.
Use ".open FILENAME" to reopen on a persistent database.
sqlite> pragma compile_options;
COMPILER=gcc-5.4.0 20160609
DEFAULT_SYNCHRONOUS=2
DEFAULT_WAL_SYNCHRONOUS=2
ENABLE_FTS5
ENABLE_RTREE
SYSTEM_MALLOC
THREADSAFE=1

который, кажется, указывает на то, что FTS5 доступен в моей /usr/local/bin/sqlite3 версии.

Однако, когда я запускаю

import sqlite3

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

print(available_pragmas)

, он выдает:

[('COMPILER=gcc-5.4.0 20160609',), ('DEFAULT_SYNCHRONOUS=2',), ('DEFAULT_WAL_SYNCHRONOUS=2',), 
('ENABLE_FTS3',), ('ENABLE_RTREE',), ('SYSTEM_MALLOC',), ('THREADSAFE=1',)]

Нет ENABLE_FTS5 в этом списке.

Я пробовал с Python 3.7.6 (по умолчанию, De c 19 2019, 23:49:42) и Python 3.6.7 (по умолчанию, 25 октября) 2018, 09:16:13).

Ответы [ 2 ]

1 голос
/ 16 февраля 2020

Вы бы вызвали .enable_load_extension(True) и .load_extension('fts5') для объекта подключения, а не для модуля.

Однако это не должно быть необходимым, поскольку, как вы видели, ваша установка поддерживает полнотекстовый поиск.

Вот способ проверить это, просто чтобы убедиться:

import sqlite3 

conn = sqlite3.connect(':memory:')
conn.execute("""create virtual table fts5test using fts5 (data);""") 
conn.execute("""insert into fts5test (data) 
                values ('this is a test of full-text search');""")
conn.execute("""select * from fts5test where data match 'full';""").fetchall() 

Результат:

In [67]: conn.execute("""select * from fts5test where data match 'full';""").fetchall()
Out[67]: [('this is a test of full-text search',)]
0 голосов
/ 04 апреля 2020

Самый простой способ использования sqlite enable с FTS5 - это python в среде conda. По умолчанию sqlite поставляется скомпилированным и установлен с последней версией.

Вы можете сделать следующее (на своем терминале):

# create a conda environment py_env
conda create -n py_env python=3.7

# activate your environment
conda activate py_env

Теперь все, что вам нужно сделать, это запустить python из этой среды использовать sqlite3.

...