Правильно установите 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',)]
Следовательно, мои вопросы:
- Можно ли как-нибудь сделать портативный пакет linux для моего приложения с поддержкой sqlite3 FTS5 как в системе python, так и в системе linux?
- Есть ли способ связать модуль 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