Подтвердить что ты не робот

Force Python откажется от собственного sqlite3 и использует (установленную) последнюю версию sqlite3

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

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(i.s.o. sqlite3.version_info) создает 2.4.1.

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

4b9b3361

Ответ 1

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 -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

Теперь загрузите и извлеките исходный tarball 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 script:

$ /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>

Ответ 2

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

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

Ответ 3

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

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

import sys
print(sys.path)

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

print(sqlite3.__file__)

Ответ 4

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