DictCursor在psycopg2下似乎不起作用

2024-05-06 07:58:33 发布

您现在位置:Python中文网/ 问答频道 /正文

我以前从未使用过psycopg2,但我正在尝试将游标工厂更改为DictCursor,以便fetchall或fetchone将返回字典而不是列表。

我创建了一个测试脚本,使事情变得简单,只测试这个功能。这是我觉得应该有用的一点代码

import psycopg2
import psycopg2.extras

conn = psycopg2.connect("dbname=%s user=%s password=%s" % (DATABASE, USERNAME, PASSWORD))

cur = conn.cursor(cursor_factory = psycopg2.extras.DictCursor)
cur.execute("SELECT * from review")

res = cur.fetchall()

print type(res)
print res

res变量始终是一个列表,而不是我所期望的字典。

我目前实现的一个解决方法是使用这个函数来构建字典,并通过它运行fetchall返回的每一行。

def build_dict(cursor, row):
    x = {}
    for key,col in enumerate(cursor.description):
        x[col[0]] = row[key]
    return d

Python是2.6.7版,psycopg2是2.4.2版。


Tags: keyimportextras列表字典rescolconn
3条回答

另一种解决方案是使用Named Tuple Cursor,因为真正的Dict游标将中断任何使用整数指示符的查询,如文档中所述。

使用命名元组游标,可以使用点语法访问它们,如下所示:

import psycopg2
import psycopg2.extras
cur = conn.cursor(cursor_factory = psycopg2.extras.NamedTupleCursor)
cur.execute("SELECT * from review")
res = cur.fetchone()
res.key1
res.key2

据我所知,这样可以保持东西整洁,不会弄坏任何东西。

res = cur.fetchall()

使res成为psycopg2.extras.DictRows的列表


或者,您可以利用cur是一个iterable的事实,而不是调用cur.fetchall

cur.execute("SELECT * from review")
for row in cur:
    print(row['column_name'])

因此,您将能够使用类似于dict的语法访问数据。

使用RealDictCursor:

cur = conn.cursor(cursor_factory = psycopg2.extras.RealDictCursor)
cur.execute("SELECT * from review")
res = cur.fetchall()    

这将提供一个包含行的列表作为真正的python字典,而不是“高级psycopg2列表”。

相关问题 更多 >