当前位置: 首页 > 面试题库 >

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

轩辕修能
2023-03-14
问题内容

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

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

我已经用“
easy_install”编辑了最新的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模块?


问题答案:

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_infosqlite3pysqlite2或内置的sqlite3)数据库html" target="_blank">适配器的版本。
sqlite_version_info是基础sqlite3数据库库的版本。

from ... import ... as sqlite3建议使用,这样,如果您从一个版本迁移到另一个版本,则无需更改其余代码。

注意,enable_load_extension最早出现在pysqlite22.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库进行构建。在pysqlite2setup.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)")
<pysqlite2.dbapi2.Cursor object at 0xca5e0>


 类似资料:
  • 问题内容: 我有一个使用“线程”模块的Python程序。每秒一次,我的程序启动一个新线程,该线程从Web上获取一些数据,并将这些数据存储到我的硬盘中。我想使用sqlite3来存储这些结果,但是我无法使其正常工作。问题似乎与以下几行有关: 如果将这行代码放入每个线程中,则会收到OperationalError通知我数据库文件已锁定。我猜这意味着另一个线程通过sqlite3连接打开了mydatabas

  • 本文向大家介绍使用npm安装最新版本nodejs,包括了使用npm安装最新版本nodejs的使用技巧和注意事项,需要的朋友参考一下 # 安装 nodejs  以下介绍的是命令行安装方法,读者也可以到 nodejs官网 上下载安装最新版。 升级npm为最新版本 sudo npm install npm@latest -g 往往用命令行安装的nodejs不是最新版本,而且升级nodejs并不是件非常简

  • 问题内容: 是否可以在启动Android应用程序时检查用户是否具有该应用程序的最新版本,如果没有,则强制他进行更新?或者至少检查是否有新版本并告诉他,该应用程序只有在他下载并安装更新后才能再次运行? 背景是我有一个需要与服务器通信的应用程序。当我在服务器和客户端之间的界面中更改某些内容时,我想确保客户端具有最新版本。 有任何本地方法可以做到这一点吗?还是我必须自己检查一下? 仅当您具有mysql数

  • 我目前正在使用webstorm作为我的IDE选择,并且正在尝试安装更好的SQLite3,但是每次尝试安装时都会收到以下错误消息: 更新:我已经在故障排除页面上完成了所有操作,这是我得到的错误消息: 我已经安装了VSCode,“缺少任何VC++工具集”似乎是问题的症结所在

  • 问题内容: 我的雇主有一个专用模块1,我们用于内部单元/系统测试;但是,该模块的作者不再在这里工作,并且要求我使用它来测试某些设备。 问题在于,该版本需要(v8.2.0)的较旧版本,并且需要导入33个不同的文件中。我试过在v11.0.0下运行单元测试,甚至看不到TCP SYN数据包2。不幸的是,我已经在我的实验室linux服务器上安装了Twisted v11.0.0 ,并且我有依赖于它的代码。 我

  • 我试图找到一种方法(脚本或Java),通过这种方法,我可以将最新Java版本(或任何给定版本)的已弃用API(类、接口、方法、字段等)列表提取到csv文件中。 我的输出将是一个csv文件,其中包含 /接口/方法/字段|不推荐的原因/补救组织。springframework。行程安排。计时器。TimerTaskExecutionException |如果TimerTask引发异常,计时器的主循环将简

  • 问题内容: 我有一个普通的Node.js脚本,该脚本通过API从Wikipedia中提取数据并将其存储在SQLite数据库中。我正在使用此node- sqlite3 模块。 在某些情况下,我要提取多达60万篇文章中的数据,并在数据库中连续存储有关每篇文章的一些元数据。从API中以500为一组检索文章。 检索带有500条文章中的数据的JSON对象的请求将对象传递给此回调: 这些模块默认情况下并行运行

  • SQLite具有不同级别的锁:、、、、。 我找不到调用SQLite API获取和释放锁定的信息。 据我所知,调用sqlite3\U步骤时获得锁。锁的类型取决于预处理语句的表达式。此外,此命令还可以升级自定义事务内的锁定写入操作。 据我所知,写入锁也是由sqlite3\u步骤释放的-此函数返回SQLITE\u DONE或错误代码。我没有找到任何文档,但该函数应该在执行结束时释放保留的待处理的独占的。