psycopg2.extras.DictCursor没有在postgres中返回dict

时间:2018-06-03 12:49:29

标签: python postgresql psycopg2

我使用psycopg2使用以下查询访问postgres数据库。为了从执行的查询返回一个字典,我在我的光标中使用DictCursor,但我的输出仍然是一个列表,而不是一个dictonary。

以下是程序和输出。

import psycopg2.extras

try:
    conn = psycopg2.connect("user='postgres' host='localhost' password='postgres'",
                            )
except:
    print "I am unable to connect to the database"

cur = conn.cursor(cursor_factory=psycopg2.extras.DictCursor)

cur.execute("""SELECT datname from pg_database""")


rows = cur.fetchall()
print "\nShow me the databases:\n"
print rows

输出: -

[['template1'], ['template0'], ['postgres'], ['iip'], ['test'], ['test_postgres'], ['testdb']]

2 个答案:

答案 0 :(得分:3)

对于那些因为真的喜欢简单地引用column:value记录表示形式的字典而来的人来说,PRMoureu的回答指出DictRow具有所有常用的字典逻辑,意味着您可以迭代带有.items()的DictRow并获取key:value对。

rows = cur.fetchall()
row_dict = [{k:v for k, v in record.items()} for record in rows]

将把DictRow记录列表变成dict记录列表。

答案 1 :(得分:0)

它看起来像一个列表,闻起来像一个列表,但它是一个DictRow

rows = cur.fetchall()
for row in rows :
    print(type(row))

#>>> <class 'psycopg2.extras.DictRow'>

这意味着您仍然可以使用列名作为访问数据的键:

rows = cur.fetchall()
print([row['datname'] for row in rows])

This class直接从内置list继承并添加实现字典逻辑所需的所有方法,但它不会更改代表__repr__或{{1}输出与列表相同。

__str__

class DictRow(list): """A row object that allow by-column-name access to data.""" 将所有查询的行打包在列表中,而不指定确切的类型。

是的,也许你正在寻找这种光标:RealDictCursor