我试图摆脱的错误信息是:
AttributeError:'sqlite3.Connection'对象没有属性'enable_load_extension'
我有'easy_install'-ed最新的sqlite3版本和python以某种方式知道它存在,因为sqlite3.version_info产生3.6.13.在此版本中,Connection应具有"enable_load_extension"属性.
我认为正在进行的是python仍然使用本机sqlite3模块,我认为是2.4.1,因为sqlite3.version(iso sqlite3.version_info)产生2.4.1.
问题是如何强制python使用新的sqlite3模块进行所有sqlite3调用?
sqlite3
Python中的支持可能有点令人困惑.sqlite数据库适配器最初是作为一个单独的项目pysqlite2开始的,但是对于Python 2.5,它的一个版本以sqlite3的名称合并到Python标准库中.原始适配器继续作为单独的项目开发,同时定期更新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中.
编辑: 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
源tarball:
$ 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 </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()
如果他们通过了,你应该全力以赴.
作为奖励,如果您想要加载扩展支持的原因是使用sqlite3
的全文搜索扩展名FTS3
,您应该发现它是作为静态库的一部分包含在内的,不需要进一步的工作:
>>> from pysqlite2 import dbapi2 as sqlite3 >>> con = sqlite3.connect(":memory:") >>> con.execute("create virtual table recipe using fts3(name, ingredients)")
我在Windows机器上有python 2.7,内置的sqlite3.sqlite_version是3.6.x. 通过执行以下步骤,我能够使用sqlite 3.7.9.
下载并解压缩预编译的二进制DLL(http://www.sqlite.org/download.html上的"sqlite-dll-win32-x86-3070900.zip" )
(此时可能应关闭所有python实例以保证安全)转到C:\ Python27\DLLs并将"sqlite3.dll"的文件名更改为"sqlite3.dll.old"
将文件"sqlite3.dll"复制到文件夹C:\ Python27\DLLs
打开python shell并导入sqlite3
验证sqlite3.sqlite_version显示为"3.7.9"