力的Python放弃本地的sqlite3和使用(已安装)最新版本的sqlite3的(Force Py

2019-07-21 18:39发布

我试图摆脱的是错误信息:

AttributeError的:“sqlite3.Connection”对象有没有属性“enable_load_extension”

我有“easy_install'-ED最新的sqlite3版本和蟒蛇不知何故知道它的存在,因为sqlite3.version_info生产3.6.13。 在这个版本的连接应该具有“enable_load_extension”属性。

我想是怎么回事的是,蟒蛇仍使用原生sqlite3的模块,我认为这是因为2.4.1 sqlite3.version(ISO sqlite3.version_info)产生2.4.1。

现在的问题是如何强制Python中使用新的sqlite3的模块为所有sqlite3的电话?

Answer 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是版本sqlite3pysqlite2或内置sqlite3 )数据库适配器。 sqlite_version_info是底层的版本sqlite3数据库库。

使用from ... import ... as 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 。 此步骤可能需要很长的时间才能完成。

UPDATE(2015年7月21日):根据最新pysqlite 2.6.3提交你必须自己下载源码源代码,并把它们放在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>


Answer 2:

我有一个Windows机器上的Python 2.7和内置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. (也许应该在这一点上关闭蟒蛇的所有实例只是为了安全起见)进入C:\ Python27 \ DLL和改变文件名的“sqlite3.dll”到“sqlite3.dll.old”
  3. 文件“sqlite3.dll”复制到文件夹C:\ Python27 \的DLL
  4. 打开蟒蛇外壳和进口的sqlite3
  5. 验证sqlite3.sqlite_version显示为“3.7.9”


Answer 3:

你需要看看你的Python路径,确保所需的SQLite是安装在比内置的sqlite的较早目录。

你可以看到的路径:

import sys
print(sys.path)

如果你想找出一个模块是从,请尝试:

print(sqlite3.__file__)


Answer 4:

取而代之的是标准的Python sqlite3模块,您可能能够使用APSW模块,更紧跟SQLite的API第三方SQLite的模块。 它包括用于装载扩展的支持,以及基本上任何所允许的SQLite的C / C ++的API中。 它还试图尽可能地保持最新与SQLite的任何新的变化。



文章来源: Force Python to forego native sqlite3 and use the (installed) latest sqlite3 version