You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何重置已设置为sqlite3.Row的Python sqlite3连接row_factory属性

Python sqlite3连接row_factory属性重置方案

异常根因

  • 已创建的游标会继承生成时刻连接对象的row_factory配置,后续修改连接的row_factory不会对已存在的游标生效,直接复用修改前生成的游标调用fetchone会触发异常
  • 使用delattr删除row_factory属性属于非法操作,sqlite3底层C实现没有处理属性被删除的场景,会触发段错误,官方不支持该操作

可行解决方案

sqlite3连接默认的row_factory值就是None,对应返回元组格式的结果,正确重置操作如下:

  1. 直接将连接对象的row_factory属性赋值为None即可完成重置,不需要删除属性
  2. 重置完成后必须重新执行查询语句,使用新生成的游标获取结果

修正后代码示例

import sqlite3
con = sqlite3.connect("db.dat", isolation_level=None)
con.row_factory = sqlite3.Row
# 插入数据
con.execute("insert into test1 (name, last) values (?, ?)", ("John","doe"))
con.execute("insert into test1 (name, last) values (?, ?)", ("Liz","doe"))
# 按字典格式查询
cur = con.execute("select * from test1")
print(cur.fetchone()) # 输出可按字典取值的sqlite3.Row对象

# 重置row_factory为默认值
con.row_factory = None
# 重新执行查询,使用新配置的游标
cur = con.execute("select * from test1")
print(cur.fetchone()) # 正常输出元组格式结果:('John', 'doe')

补充说明

如果需要在同一个连接中交替返回字典/元组格式,不需要重新建立连接,每次执行查询前按需设置对应row_factory再执行查询即可。

内容的提问来源于stack exchange,提问作者JohnnyLoo

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.24 21:57:02