强制Python放弃原生sqlite3并使用(安装的)最新的sqlite3版本
我试图摆脱的错误消息是:
AttributeError:'sqlite3.Connection'对象没有属性'enable_load_extension'
我'easy_install'-ed最新的sqlite3版本和python莫名其妙地知道它在那里,因为sqlite3.version_info产生3.6.13。 在这个版本中,连接应该有'enable_load_extension'属性。
我认为是python仍然使用原生sqlite3模块,我认为是2.4.1自sqlite3.version(iso sqlite3.version_info)产生2.4.1。
问题是我如何强制python的所有sqlite3调用使用新的sqlite3模块?
Python中的sqlite3
支持可能有点混乱。 sqlite数据库适配器作为一个单独的项目pysqlite2开始 ,但是对于Python 2.5,它的一个版本以sqlite3的名字被合并到Python标准库中。 原来的适配器继续作为单独的项目开发,而定期更新Python本身的版本以匹配它。 如果您尝试使用较新版本的适配器,通常将其安装为pysqlite2
以免与标准库中包含的版本发生冲突。 而且,根据它的构build方式,它可能链接到不同版本的底层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
build议使用from ... import ... as sqlite3
,以便在从一个版本移动到另一个版本时,不需要更改其他代码。
请注意, enable_load_extension
首先出现在pysqlite2
2.5.0中。
编辑: enable_load_extension
默认情况下,当您生成适配器时禁用。 要启用它,你可以手动build立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
库来构build。 这在pysqlite2
setup.py脚本中变得很简单:
$ /path/to/python2.x setup.py build_static
这将自动下载最新的sqlite3合并源,并构build适配器以及最新的静态链接版本的sqlite3
。 这一步可能需要很长时间才能完成。
更新(2015/07/21) :根据最新的pysqlite 2.6.3提交你必须自己下载sqlite源代码,并把它们放在pysqlite根文件夹。
现在,安装适配器:
$ sudo /path/to/python2.x setup.py install
并运行testing:
$ cd # somewhere out of the build directory $ /path/to/python2.x >>> from pysqlite2 import test >>> test.test()
如果他们通过,你应该全部设置。
作为奖励,如果你想要加载扩展支持的原因是使用sqlite3
的全文search扩展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>
我有一个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”);
- (可能应该closurespython的所有实例,只是为了安全)转到C:\ Python27 \ DLL并将“sqlite3.dll”的文件名更改为“sqlite3.dll.old”
- 将文件“sqlite3.dll”复制到文件夹C:\ Python27 \ DLLs
- 打开python shell并导入sqlite3
- validationsqlite3.sqlite_version显示为“3.7.9”
你需要看看你的Pythonpath,并确保你想要的sqlite安装在比内置的sqlite早一个目录。
你可以看到path:
import sys print sys.path
如果你想找出模块来自哪里,请尝试:
print sqlite3.__file__
您可以使用apsw模块(一种更接近SQLite API的第三方SQLite模块)代替标准的Python sqlite3
模块。 它包括对加载扩展的支持,以及基本上SQLite C / C ++ API中允许的任何东西。 它还尽可能地跟上SQLite的新变化。