Я разрабатываю инструмент Python, который использует виртуальную таблицу sqlite3 с FTS5 (полнотекстовый поиск). Я хотел бы знать, как правильно установить из 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
4
Carlos Vega 1 Мар 2018 в 18:38

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
1
urban 12 Мар 2018 в 08:33

Самый простой способ - использовать 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. Подробнее в этой статье Чарльза Лейфера <> / а> .

1
saaj 6 Мар 2018 в 15:20

Спасибо за ваши ответы @urban и

После этого в докере 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
1
Carlos Vega 16 Мар 2018 в 11:59