如果我使用psycopg2,如何返回字典或JSON?

9

我尝试使用 RealDictCursor:

cur = conn.cursor(cursor_factory = psycopg2.extras.RealDictCursor)
cur.execute('SELECT * FROM items')
res = cur.fetchall()
print(res)
print(type(res[0]))

但是它不起作用。结果:
[RealDictRow([('id', 1), ('name', 'apple')]), RealDictRow([('id', 2), ('name', 'pen')])]
<class 'psycopg2.extras.RealDictRow'>

我需要一个词典,输出应该如下所示:

[{"id": 1, "name": "apple"}, {"id": 2, "name": "pen"}]
<class 'dict'>

是的,我知道可以使用for循环来创建字典。但是我有一个包含 10000 行的表格,并且需要快速展示这 10000 个项目。(我认为使用for循环不能很快地解决我的问题。这是真的吗?你能给我一些建议来在最短的时间内快速解决我的问题吗?)

我该如何获得解决方案呢?

PS:我需要用 Flask 的 API 服务,所以之后我需要像这样返回结果:

return jsonify({my_dictonary_sql_query})
1个回答

6
您从打印的人性化表示中检索到数据,这是一种假设。实际上,数据在内部是以字典形式存在的。
import json
#
return json.dumps(cur.fetchall())

3
请明确,根据文档RealDictRowdict的子类。 - alkasm
谢谢您的回答,但是您能否给我一些建议,以最少的时间解决我的问题?json.dumps(cur.fetchall())比循环for更快吗? - Vlad
如果你使用常用的快捷方式,在Python中,你可以说不涉及额外变量的较小代码更快。 - ipaleka
在内部,它可能是一个字典,但如果不先进行转换,它就无法像字典一样干净地序列化,因此想要一个常规字典是有效的,尽管它在其他方面看起来像字典。当天真地序列化(例如使用airflow的xcom_push)时,RealDictRow文本包含在文本序列化中。 - Brendan
2
此外,Postgres 返回的并不是所有字段都可以直接使用 json.dumps 进行序列化。例如,日期时间字段就需要进行特殊处理。您可以通过在 json.dumps(cur.fetchall(), default=str) 中添加默认字符串来解决这个问题,或者自己编写编码器(请参阅:https://docs.python.org/3/library/json.html#json.JSONEncoder)。 - Brendan

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接