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

使用from ... import ... as sqlite3build议使用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。

  1. 下载并解压缩预编译的二进制DLL( http://www.sqlite.org/download.html上的“sqlite-dll-win32-x86-3070900.zip”);
  2. (可能应该closurespython的所有实例,只是为了安全)转到C:\ Python27 \ DLL并将“sqlite3.dll”的文件名更改为“sqlite3.dll.old”
  3. 将文件“sqlite3.dll”复制到文件夹C:\ Python27 \ DLLs
  4. 打开python shell并导入sqlite3
  5. 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的新变化。