psycopg2:DictCursor与RealDictCursor

时间:2017-07-30 11:32:56

标签: python python-3.x postgresql psycopg2

AFAIU和文档,RealDictCursor是一个专门的DictCursor,它只能从键(也就是列名)访问列,而DictCursor可以从键或索引号访问数据。
我想知道为什么如果DictCursor提供更多的灵活性,RealDictCursor已被实现?它在性能方面(或记忆方面)如此不同(有利于我想象的RealDictCursor)? 换句话说,什么是RealDictCursor用例与DictCursor?

2 个答案:

答案 0 :(得分:1)

psycopg2.extras类。 RealDictCursor (* args,** kwargs)

使用实字典作为行的基本类型的游标。请注意,此游标非常专业,并且不允许正常访问(使用整数索引)来访存数据。如果您需要同时以字典和列表的形式访问数据库行,则使用通用的 DictCursor 而不是 RealDictCursor 。类psycopg2.extras。 RealDictConnection 一个自动使用 RealDictCursor 的连接。

注意 自Psycopg2.5起不是很有用:您可以使用psycopg2.connect(dsn,cursor_factory = RealDictCursor )代替 RealDictConnection 。类    psycopg2.extras。 RealDictRow (光标)一个dict子类,表示一个    数据记录。


答案 1 :(得分:1)

真正的字典游标的主要优点是易于将查询输出作为json获取。

比较:

with psycopg2.connect('dbname=test') as connection:
    with connection.cursor(cursor_factory=RealDictCursor) as cursor:
        cursor.execute("select * from my_table")
        print(json.dumps(cursor.fetchall()))

with psycopg2.connect('dbname=test') as connection:
    with connection.cursor() as cursor:
        cursor.execute("select * from my_table")
        columns = [desc[0] for desc in cursor.description]
        real_dict = [dict(zip(columns, row)) for row in cursor.fetchall()]
        print(json.dumps(real_dict))

在性能方面,这些选项之间没有重要区别。

对于常规或类似字典的游标,无法使用json.dumps(cursor.fetchall())获得预期的json,并且需要上面显示的转换。另一方面,真正的字典游标会产生更大的结果,因此,如果您真的不需要它,则不要使用它。