设置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
相关产品推荐
相关产品推荐

