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

Чтобы проверить, работает ли расширение FTS5 с модулем sqlite3 Python, я использую этот код из Vorsprung durch Technik :

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

Код отлично работает на Ubuntu 18.04 и Ubuntu 19.04. Например, можно запустить его через Docker с помощью следующего интерпретатора python3 .7:

docker pull ubuntu:18.04 # This line is optional.
docker run --interactive --tty ubuntu:18.04 bash
apt update
apt install -y software-properties-common
add-apt-repository -y ppa:deadsnakes/ppa
apt update 
apt install -y python3.7
python3.7
# use here the python code given above 

Однако, если я изменю версию Ubuntu с 18.04 на 16.04, расширение FTS5 не будет работать :

docker pull ubuntu:16.04 # This line is optional.
docker run --interactive --tty ubuntu:16.04 bash
apt update
apt install -y software-properties-common
add-apt-repository -y ppa:deadsnakes/ppa
apt update 
apt install -y python3.7
python3.7
# use here the python code given above 

Код python создаст sh:

[GCC 5.4.0 20160609] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>> import sqlite3
>>> conn = sqlite3.connect(':memory:')
>>> conn.execute("""create virtual table fts5test using fts5 (data);""")
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
sqlite3.OperationalError: no such module: fts5

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

1 Ответ

1 голос
/ 04 апреля 2020

Эти две статьи ( Заставить Python на передний план go собственный sqlite3 и использовать (установленную) последнюю версию sqlite3 и http://charlesleifer.com/blog/using-the-sqlite-json1-and-fts5-extensions-with-python/) могут стать решением вопрос.

Попробуйте выполнить следующие действия:

  1. Загрузите исходный код SQLite и соберите его с включенным FTS5.

    $ wget https://www.sqlite.org/2020/sqlite-autoconf-3310100.tar.gz
    $ tar xvzf sqlite-autoconf-3310100.tar.gz
    $ cd sqlite-autoconf-3310100
    $ CFLAGS="-DSQLITE_ENABLE_FTS5" ./configure
    $ make sqlite3.c
    
  2. До вы можете продолжить, вы можете активировать свою виртуальную среду.

    $ source <path to Python3.7 virtual environment>/bin/activate
    (python37env) $
    
  3. Автор этой статьи (http://charlesleifer.com/blog/using-the-sqlite-json1-and-fts5-extensions-with-python/) взял SQLite3 DB-API 2.0 драйвер от Python 3 отдельным пакетом ( введите описание ссылки здесь ). Таким образом, вы можете использовать его для замены оригинального драйвера.

    (python37env) $ wget https://github.com/coleifer/pysqlite3/archive/0.4.2.tar.gz
    (python37env) $ tar xvzf 0.4.2.tar.gz
    (python37env) $ cd pysqlite3-0.4.2
    (python37env) $ cp <path to sqlite-autoconf-3310100>/sqlite3.h .
    (python37env) $ cp <path to sqlite-autoconf-3310100>/sqlite3.c .
    (python37env) $ python setup.py build_static build
    (python37env) $ python setup.py install
    

    Теперь отдельный модуль pysqlite должен быть установлен в вашей виртуальной среде.

  4. Протестируйте его. Вместо использования import sqlite3 для импорта модуля pysqlite3 используйте from pysqlite3 import dbapi2 as sqlite3. Это позволит импортировать драйвер SQLite3 DB-API 2.0 из пользовательского модуля pysqlite. И ваш тестовый код будет выглядеть следующим образом:

    # import sqlite3
    from pysqlite3 import dbapi2 as 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()
    

Этот метод работает на моей виртуальной машине Ubuntu 16.04 с Python 3.7.3.

...