Вынудите Python предшествовать собственному sqlite3 и использовать (установленную) последнюю sqlite3 версию

Вы предположение корректны. Это столь же просто как массив C NSUInteger. Параметр длины является числом элементов в индексном массиве.

Массивы в C часто идентифицируются как указатель (в этом случае NSUInteger *) с параметром длины или известным разделителем такой как \0 для струн до (который является просто массивом символов).

33
задан JeromeJ 8 September 2013 в 20:50
поделиться

2 ответа

Поддержка sqlite3 в Python может немного сбивать с толку. Адаптер базы данных sqlite начинался как отдельный проект, pysqlite2 , но для Python 2.5 его версия была включена в стандартную библиотеку Python под именем sqlite3 . Исходный адаптер продолжает разрабатываться как отдельный проект, в то время как версия в Python периодически обновляется, чтобы соответствовать ей. Если вы пытаетесь использовать более новую версию адаптера, она обычно устанавливается как pysqlite2 , чтобы не конфликтовать с версией, включенной в стандартную библиотеку. И, в зависимости от того, как он был построен, он может ссылаться на другую версию базовой библиотеки sqlite3 . Поэтому убедитесь, что вы импортируете его правильно: sqlite_version_info - это версия базовой библиотеки sqlite3 .

Использование из ... импорта ... как sqlite3 предлагается, чтобы остальная часть ваш код не нужно менять, если вы переходите с одной версии на другую.

Обратите внимание: enable_load_extension впервые появился в pysqlite2 2.5.0.

РЕДАКТИРОВАТЬ: enable_load_extension по умолчанию отключено при сборке адаптера. Чтобы включить его, вы можете вручную собрать pysqlite2 . Следующий рецепт предполагает систему unix -y и последнюю версию pysqlite2 , которая на момент написания этой статьи - 2.5.5.

Во-первых, если вы изначально установили адаптер через easy_install , удалите его, запустив сначала:

$ sudo /path/to/easy_install -m pysqlite # or whatever package name you first used

В результате будут выведены такие строки, как:

Removing pysqlite 2.5.5 from easy-install.pth file

Using /path/to/site-packages/pysqlite-2.5.5-py2.x-something.egg

Удалите яйцо, используя указанное имя файла (имя будет зависеть от вашей платформы и версии и может относиться к файлу или каталогу):

$ sudo rm -r /path/to/site-packages/pysqlite-2.5.5-py2.x-something.egg

Теперь загрузите и извлеките архив исходного кода pysqlite-2.5.5 :

$ mkdir /tmp/build
$ cd /tmp/build
$ curl http://oss.itsystementwicklung.de/download/pysqlite/2.5/2.5.5/pysqlite-2.5.5.tar.gz | tar xz
$ cd pysqlite-2.5.5

Затем отредактируйте файл setup.cfg , чтобы закомментировать директиву SQLITE_OMIT_LOAD_EXTENSION :

$ ed setup.cfg <<EOF
> /SQLITE_OMIT_LOAD_EXTENSION/s/define=/#define=/
> w
> q
> EOF

Поскольку версия sqlite3 очень старая (3.4.0), вам также следует использовать последнюю библиотеку sqlite3 . Это легко сделать в скрипте pysqlite2 setup.py:

$ /path/to/python2.x setup.py build_static

Это автоматически загрузит последний исходный код объединения sqlite3 и соберет адаптер вместе с обновленным статически- связанная версия sqlite3 . Этот шаг может занять много времени.

ОБНОВЛЕНИЕ (2015/07/21) : согласно последней фиксации pysqlite 2.6.3 вы должны загрузить Исходный код sqlite самостоятельно и поместите его в корневую папку pysqlite.

Теперь установите адаптер:

$ sudo /path/to/python2.x setup.py install

и запустите тесты:

$ cd     # somewhere out of the build directory
$ /path/to/python2.x
>>> from pysqlite2 import test
>>> test.test()

, и, если они пройдут успешно, все будет готово.

Как бонус, если вам нужна поддержка расширения загрузки, чтобы использовать расширение полнотекстового поиска FTS3 sqlite3 , вы должны обнаружить, что оно было включено как часть статической библиотеки, а не необходима дальнейшая работа:

>>> from pysqlite2 import dbapi2 as sqlite3
>>> con = sqlite3.connect(":memory:")
>>> con.execute("create virtual table recipe using fts3(name, ingredients)")
<pysqlite2.dbapi2.Cursor object at 0xca5e0>
68
ответ дан 27 November 2019 в 17:43
поделиться

Вам нужно посмотреть на свой путь к Python и убедиться, что нужный sqlite установлен в более ранний каталог, чем встроенный sqlite.

Вы можете увидеть путь с помощью:

import sys
print(sys.path)

Если вы хотите узнать, откуда взялся модуль, попробуйте:

print(sqlite3.__file__)
4
ответ дан 27 November 2019 в 17:43
поделиться
Другие вопросы по тегам:

Похожие вопросы: