我使用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']]
答案 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."""
将所有查询的行打包在列表中,而不指定确切的类型。