强制Python放弃本机sqlite3并使用(已安装)最新的sqlite3版本

时间:2009-10-09 18:53:31

标签: python sqlite

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

  

AttributeError:'sqlite3.Connection'   对象没有属性   'enable_load_extension'

我已经'easy_install'-ed了最新的sqlite3版本,并且python以某种方式知道它存在,因为sqlite3.version_info产生3.6.13。在此版本中,Connection应具有“enable_load_extension”属性。

我认为正在进行的是python仍然使用我认为是2.4.1的本机sqlite3模块,因为sqlite3.version(i.s.o. sqlite3.version_info)产生2.4.1。

问题是如何强制python使用新的sqlite3模块进行所有sqlite3调用?

4 个答案:

答案 0 :(得分:68)

Python中的

sqlite3支持可能有点令人困惑。 sqlite数据库适配器最初是作为一个单独的项目pysqlite2开始的,但是对于Python 2.5,它的一个版本被合并到名为sqlite3的Python标准库中。原始适配器继续作为单独的项目开发,同时定期更新Python本身的版本以匹配它。如果您尝试使用较新版本的适配器,则通常将其安装为pysqlite2,以免与标准库中包含的版本冲突。而且,根据它的构建方式,它可能链接到底层sqlite3 database library的不同版本。因此,请确保您正确导入它:

>>> 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 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 <<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 amalgamation source并构建适配器以及sqlite3的最新静态链接版本。这一步可能需要很长时间才能完成。

更新(2015/07/21):根据最新的pysqlite 2.6.3 commit,您必须自行下载sqlite源代码并将其放入pysqlite root文件夹中。

现在,安装适配器:

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

答案 1 :(得分:14)

我在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. (此时可能应关闭所有python实例以保证安全)转到C:\ Python27 \ DLLs并将“sqlite3.dll”的文件名更改为“sqlite3.dll.old”
  3. 将文件“sqlite3.dll”复制到文件夹C:\ Python27 \ DLLs
  4. 打开python shell并导入sqlite3
  5. 验证sqlite3.sqlite_version显示为“3.7.9”

答案 2 :(得分:4)

您需要查看Python路径并确保所需的sqlite安装在比内置sqlite更早的目录中。

您可以看到路径:

import sys
print(sys.path)

如果您想了解模块的来源,请尝试:

print(sqlite3.__file__)

答案 3 :(得分:3)

您可以使用apsw模块,而不是标准的Python sqlite3模块,这是一个更紧密遵循SQLite API的第三方SQLite模块。它包括对加载扩展的支持,以及SQLite C / C ++ API中允许的基本任何内容。它还尽可能地尝试跟上SQLite中的任何新变化。