Правильно установите sqlite3 с поддержкой FTS5

Я разрабатываю инструмент Python, который использует виртуальную таблицу sqlite3 с FTS5 (Полнотекстовый поиск). Я хотел бы знать, как правильно установить из tarball (или любым другим способом) необходимые требования для работы моего инструмента, чтобы я мог упаковать их для переносимости.

В настоящее время мне удалось установить последний выпуск tarball из sqlite. Тем не менее, когда я выполняю:

python3 -c "import sqlite3; print(sqlite3.sqlite_version)"
# or
python2 -c "import sqlite3; print(sqlite3.sqlite_version)"

я получил 3.11.0, в то время как sqlite3 --version возвращает: 3.22.0 2018-01-22 18:45:57 0c55d179733b46d8d0ba4d88e01a25e10677046ee3da1d5b1581e86726f2alt1

Системная версия sqlite3 3.22 поддерживает FTS5, как и я pragma compile_options; и получить:

COMPILER=gcc-5.4.0 20160609
ENABLE_DBSTAT_VTAB
ENABLE_FTS4
**ENABLE_FTS5**
ENABLE_JSON1
ENABLE_RTREE
ENABLE_STMTVTAB
ENABLE_UNKNOWN_SQL_FUNCTION
HAVE_ISNAN
THREADSAFE=1

Но версия Python, использующая этот скрипт, возвращает это:

[(u'ENABLE_COLUMN_METADATA',), (u'ENABLE_DBSTAT_VTAB',), (u'ENABLE_FTS3',), (u'ENABLE_FTS3_PARENTHESIS',), (u'ENABLE_JSON1',), (u'ENABLE_LOAD_EXTENSION',), (u'ENABLE_RTREE',), (u'ENABLE_UNLOCK_NOTIFY',), (u'ENABLE_UPDATE_DELETE_LIMIT',), (u'HAVE_ISNAN',), (u'LIKE_DOESNT_MATCH_BLOBS',), (u'MAX_SCHEMA_RETRY=25',), (u'OMIT_LOOKASIDE',), (u'SECURE_DELETE',), (u'SOUNDEX',), (u'SYSTEM_MALLOC',), (u'TEMP_STORE=1',), (u'THREADSAFE=1',)]

Следовательно, мои вопросы:

  1. Можно ли как-нибудь сделать портативный пакет linux для моего приложения с поддержкой sqlite3 FTS5 как в системе python, так и в системе linux?
  2. Есть ли способ связать модуль Python sqlite3 с определенным путем sqlite3?

Я попробовал все это в Ubuntu 16.04 LTS, но я бы хотел поработать и над CentOS 7.

Заранее большое спасибо.

Подробнее об установке из tarball, которую я сделал:

wget "https://www.sqlite.org/src/tarball/sqlite.tar.gz?r=release" -O sqlite.tar.gz
tar -xzvf sqlite.tar.gz
cd sqlite
./configure --enable-fts5
make
sudo make install

3 ответа

Решение

Я думаю, что это проблема связывания! Я выполнил те же шаги по установке с вами и получил те же результаты:

$ python ./test.py 
[(u'ENABLE_COLUMN_METADATA',), (u'ENABLE_FTS3',), (u'ENABLE_RTREE',), (u'ENABLE_UNLOCK_NOTIFY',), (u'ENABLE_UPDATE_DELETE_LIMIT',), (u'MAX_SCHEMA_RETRY=25',), (u'OMIT_LOOKASIDE',), (u'SECURE_DELETE',), (u'SOUNDEX',), (u'SYSTEM_MALLOC',), (u'TEMP_STORE=1',), (u'THREADSAFE=1',)]
NO

Однако, когда вы устанавливаете что-либо с помощью команды configure/make/make install в Linux, это обычно происходит в /usr/local/lib, Чтобы убедиться, что Python связывает во время выполнения с правильным .so я использовал LD_LIBRARY_PATH, В этом случае я получил:

$ LD_LIBRARY_PATH=/usr/local/lib python ./test.py 
[(u'COMPILER=gcc-4.8.5',), (u'ENABLE_FTS5',), (u'HAVE_ISNAN',), (u'TEMP_STORE=1',), (u'THREADSAFE=1',)]
YES

Кроме того, при установке библиотек может потребоваться обновить ldconfig, В моей системе (Ubuntu 14.04):

$ sudo ldconfig
$ python ./test.py 
[(u'COMPILER=gcc-4.8.5',), (u'ENABLE_FTS5',), (u'HAVE_ISNAN',), (u'TEMP_STORE=1',), (u'THREADSAFE=1',)]
YES

Обратите внимание, что использование LD_LIBRARY_PATH больше не требуется, и python ссылается на правильную библиотеку. Для этого вам нужно иметь /usr/local/lib папка в вашем ld.so.conf где-то... для меня это в

$ grep -ir local /etc/ld.so.conf.d/
/etc/ld.so.conf.d/libc.conf:/usr/local/lib

Самый простой способ - использовать apsw (Еще один Python SQLite Wrapper). Его API немного отличается от sqlite3 и вы не можете просто pip-установить его (если вы не в порядке с устаревшей версией), но все остальное хорошо, и вы можете иметь самые последние функции SQLite.

wget https://github.com/rogerbinns/apsw/releases/download/3.22.0-r1/apsw-3.22.0-r1.zip
unzip apsw-3.22.0-r1.zip
cd apsw-3.22.0-r1
python setup.py fetch --sqlite build --enable-all-extensions install

Затем,

import apsw

apsw.Connection(':memory:').cursor().execute('pragma compile_options').fetchall()

Возвращает:

[('COMPILER=gcc-5.4.0 20160609',),
 ('ENABLE_API_ARMOR',),
 ('ENABLE_FTS3',),
 ('ENABLE_FTS3_PARENTHESIS',),
 ('ENABLE_FTS4',),
 ('ENABLE_FTS5',), 
 ('ENABLE_ICU',),
 ('ENABLE_JSON1',),
 ('ENABLE_RBU',),
 ('ENABLE_RTREE',),
 ('ENABLE_STAT4',),
 ('THREADSAFE=1',)]

Сложный путь - это компилировать Python с помощью собственного SQLite. Более подробно в этой статье Чарльз Лейфер.

Спасибо за ваши ответы @urban и @saaj. Я нашел ваши ответы конструктивными.

Проблема, которую я вижу в ответе @saaj, заключается в том, что для этого требуются дополнительные пакеты, в частности apsw пакет, который не совместим с pypy, например. Мне не удалось заставить его работать, но, возможно, я виновата.

Мне действительно нравится @urban ответ. Я сделал процесс и заставил его работать. Я отметил этот ответ как правильный.

Однако я хотел бы добавить свой собственный ответ. Довольно агрессивно, но у меня это сработало. Я создал докер Ubuntu со следующим Dockerfile:

FROM ubuntu:16.04
RUN apt-get update -y
RUN DEBIAN_FRONTEND=noninteractive DEBCONF_NONINTERACTIVE_SEEN=true apt-get install -y apt-utils tzdata
RUN DEBIAN_FRONTEND=noninteractive DEBCONF_NONINTERACTIVE_SEEN=true dpkg-reconfigure tzdata
RUN echo "Europe/Berlin" > /etc/timezone
RUN dpkg-reconfigure -f noninteractive tzdata
RUN apt-get update -y
RUN apt-get install -y git build-essential sudo

После этого в докере Ubuntu я это сделал. В процессе я удаляю sqlite3 и устанавливаю его зависимости, которые я нашел в следующей статье. После этого я переустановил Python.

sudo apt-get update -y
echo "[ - Removing sqlite3... ]"
sudo apt-get remove -y sqlite3
sudo apt-get purge -y sqlite3
echo "[ - Installing sqlite3 dependencies... ]"
sudo apt-get install -y build-essential bzip2 git libbz2-dev libc6-dev libgdbm-dev libgeos-dev liblz-dev liblzma-dev libncurses5-dev libncursesw5-dev libreadline6 libreadline6-dev libsqlite3-dev libssl-dev lzma-dev python-dev python-pip python-software-properties python-virtualenv software-properties-common sqlite3 tcl tk-dev tk8.5-dev wget
echo "[ - Installing sqlite3... ]"
sudo wget "https://www.sqlite.org/src/tarball/sqlite.tar.gz?r=release" -O sqlite.tar.gz &> /dev/null
sudo tar -xzvf sqlite.tar.gz
cd sqlite
sudo ./configure --enable-fts5
sudo make
sudo make install
cd ..
echo "[ - Reinstalling python... ]"
sudo apt-get remove -y python python3 python-dev
sudo apt-get install -y --reinstall python2.7 python3 python-dev
sudo apt-get install -y build-essential bzip2 git libbz2-dev libc6-dev libgdbm-dev libgeos-dev liblz-dev liblzma-dev libncurses5-dev libncursesw5-dev libreadline6 libreadline6-dev libsqlite3-dev libssl-dev lzma-dev python-dev python-pip python-software-properties python-virtualenv software-properties-common sqlite3 tcl tk-dev tk8.5-dev wget
Другие вопросы по тегам