row_to_json和psycopg2.fetchall()结果是列表中的列表,而不是列表中的字典

时间:2018-07-17 12:23:43

标签: json postgresql psycopg2

我使用Postgres的row_to_json()函数以json对象的形式检索数据,以便像使用python字典一样处理结果。

conn = psycopg2.connect("<My_DB_DSN>")
cur = conn.cursor(cursor_factory=psycopg2.extras.DictCursor)
query_sql = "SELECT row_to_json(row) FROM (SELECT id, name FROM products) row;" 
cur.execute(query_sql)
results = cur.fetchall()
print(results)

结果是:

 [ [{"id": 1, "name": "Bob"}],
   [{"id": 2, "name": "Susan"}]
 ]

我期待这个结果:

 [ {"id": 1, "name": "Bob"},
   {"id": 2, "name": "Susan"}
 ]

有人知道为什么我会得到第一个结果以及如何解决这个问题吗?

在postgres的命令行中运行SQL查询将按预期返回json:

{"id": 1, "name": "Bob"},
{"id": 2, "name": "Susan"}

1 个答案:

答案 0 :(得分:2)

我认为您想要RealDictCursor,这将返回每一行作为dict,并且您不需要修改SQL查询:

from psycopg2.extras import RealDictCursor

cur = conn.cursor(cursor_factory=RealDictCursor)
query_sql = "SELECT id, name FROM products where id < 10" 
cur.execute(query_sql)
results = cur.fetchall()
print(results)

返回:

[{'id': 2L, 'name': 'Foo'}, {'id': 4L, 'name': 'Bar'}, ...]