Заставить Python отказаться от собственного sqlite3 и использовать (установленную) последнюю версию sqlite3 - PullRequest
32 голосов
/ 09 октября 2009

Сообщение об ошибке, от которого я пытаюсь избавиться:

AttributeError: 'sqlite3.Connection' объект не имеет атрибута 'Enable_load_extension'

У меня 'easy_install' - последняя версия sqlite3, и python каким-то образом знает, что она есть, поскольку sqlite3.version_info создает 3.6.13 В этой версии Connection должен иметь атрибут enable_load_extension.

Я думаю, что Python по-прежнему использует собственный модуль sqlite3, который, как мне кажется, 2.4.1, поскольку sqlite3.version (т.е.

Вопрос в том, как заставить Python использовать новый модуль sqlite3 для всех вызовов sqlite3?

Ответы [ 4 ]

68 голосов
/ 10 октября 2009

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

>>> import sqlite3
>>> sqlite3.version_info
(2, 4, 1)
>>> sqlite3.sqlite_version_info
(3, 6, 11)

>>> from pysqlite2 import dbapi2 as sqlite3
>>> sqlite3.version_info
(2, 5, 5)
>>> sqlite3.sqlite_version_info
(3, 6, 18)

version_info - это версия адаптера базы данных sqlite3 (pysqlite2 или встроенный sqlite3). sqlite_version_info - это версия базовой библиотеки базы данных sqlite3.

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

Примечание. enable_load_extension впервые появилось в pysqlite2 2.5.0.

EDIT: enable_load_extension отключено по умолчанию при сборке адаптера. Чтобы включить его, вы можете собрать pysqlite2 вручную. Следующий рецепт предполагает unix -й систему и последнюю версию 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 commit вам нужно загрузить исходный код 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()

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

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

>>> 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>
14 голосов
/ 06 января 2012

У меня есть Python 2.7 на машине с Windows, а встроенный sqlite3.sqlite_version был 3.6.x. Выполнив следующие шаги, я смог заставить его использовать sqlite 3.7.9.

  1. Загрузите и распакуйте предварительно скомпилированную двоичную DLL-библиотеку ("sqlite-dll-win32-x86-3070900.zip" на http://www.sqlite.org/download.html)
  2. (вероятно, на данный момент следует закрыть все экземпляры python, чтобы быть в безопасности). Перейдите в C: \ Python27 \ DLLs и измените имя файла sqlite3.dll на sqlite3.dll.old.
  3. Скопируйте файл "sqlite3.dll" в папку C: \ Python27 \ DLLs
  4. Открыть оболочку Python и импортировать sqlite3
  5. Убедитесь, что sqlite3.sqlite_version отображается как '3.7.9'
4 голосов
/ 10 октября 2009

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

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

import sys
print(sys.path)

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

print(sqlite3.__file__)
3 голосов
/ 06 марта 2014

Вместо стандартного модуля Python sqlite3 вы можете использовать модуль apsw , сторонний модуль SQLite, который более точно следует API SQLite. Он включает поддержку загрузки расширений, а также в основном все, что разрешено в SQLite C / C ++ API. Он также старается, насколько это возможно, быть в курсе любых новых изменений в SQLite.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...