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

设置sqlite3.row_factory为sqlite3.Row后,fetchall()仍返回元组而非字典的原因咨询

设置sqlite3.row_factory为sqlite3.Row后,fetchall()仍返回元组而非字典的原因咨询

嘿,我来帮你分析下这个问题~你遇到的情况其实是因为设置row_factory的时机不对,还有对sqlite3.Row的特性有点小误解,咱们一步步拆解:

首先看你的代码顺序:

con = sqlite3.connect("funds.db")
with con:
    cur = con.cursor()
    con.row_factory = sqlite3.Row
    funds = cur.execute("SELECT * from funds").fetchall()
    print(funds)

核心问题就在这里:当你调用con.cursor()创建游标时,这个游标会继承当时connection的row_factory设置——而此时你还没把row_factory改成sqlite3.Row,所以这个游标还是用默认的元组格式返回结果。之后再修改con的row_factory,对已经创建好的cur没有任何影响哦。

那正确的做法有两种,选哪种都可以:

  • 先设置connection的row_factory,再创建游标:
    con = sqlite3.connect("funds.db")
    with con:
        con.row_factory = sqlite3.Row
        cur = con.cursor()
        funds = cur.execute("SELECT * from funds").fetchall()
        print(funds)
    
  • 直接给创建好的游标单独设置row_factory:
    con = sqlite3.connect("funds.db")
    with con:
        cur = con.cursor()
        cur.row_factory = sqlite3.Row
        funds = cur.execute("SELECT * from funds").fetchall()
        print(funds)
    

另外补充个小细节:sqlite3.Row返回的并不是标准的Python字典,而是一个支持按列名访问的类字典对象。它的打印形式看起来可能和元组很像,但你可以用row["column_name"]或者row.get("column_name")来访问具体列的值,要是需要转成真正的字典,直接用dict(row)就行。

这样调整之后,你就能得到符合预期的、可以按列名读取的结果啦~

备注:内容来源于stack exchange,提问作者Justin Chee

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.22 14:59:50