sqlite3 在 Python 中的支持可能有点令人困惑。 sqlite 数据库适配器最初是一个单独的项目,pysqlite2,但对于 Python 2.5,它的一个版本被合并到 Python 标准库中,名称为 sqlite3。原始适配器继续作为单独的项目开发,同时 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_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 源压缩包:
$ 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 根文件夹中。
现在,安装适配器:
$ 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>