Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/python-3.x/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python psycopg2:DictCursor与RealDictCursor_Python_Python 3.x_Postgresql_Psycopg2 - Fatal编程技术网

Python psycopg2:DictCursor与RealDictCursor

Python psycopg2:DictCursor与RealDictCursor,python,python-3.x,postgresql,psycopg2,Python,Python 3.x,Postgresql,Psycopg2,RealDictCursor是一种专门的DictCursor,它只允许从键(也称为列名称)访问列,而DictCursor允许从键或索引号访问数据。 我想知道如果DictCursor提供了更多的灵活性,为什么要实现RealDictCursor?它在性能方面(或内存方面)是否如此不同(有利于我想象中的RealDictCursor…? 换句话说,什么是RealDictCursor用例与DictCursor?类psycopg2.extras.RealDictCursor(*args,**kwargs)

RealDictCursor是一种专门的DictCursor,它只允许从键(也称为列名称)访问列,而DictCursor允许从键或索引号访问数据。
我想知道如果DictCursor提供了更多的灵活性,为什么要实现RealDictCursor?它在性能方面(或内存方面)是否如此不同(有利于我想象中的RealDictCursor…?

换句话说,什么是RealDictCursor用例与DictCursor?

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

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

注意 因为Psycopg2.5,所以不是很有用:您可以使用Psycopg2.connect(dsn,cursor\u factory=RealDictCursor)而不是RealDictConnection。班 psycopg2.extras.RealDictRow(游标)表示 数据记录



real dictionary cursor的主要优点是易于获得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,需要上面显示的转换。另一方面,real dictionary cursor会产生更大的结果,因此如果您真的不需要它,就不应该使用它。

事实上,它们与文档描述不同:access类似,但如果您使用json.dumps(您的请求),DictCursor不会显示键,RealDictCursor将显示它们。我假设如果查询返回大量行,那么每行的实际dict将是一个巨大的开销,因为它存储每行上每个值的键(列名),而不是内存占用较小的常规元组。我个人认为命名变量和命名数据库列比假设数据库表中列的顺序和数量永远不会改变更可取,并且总是尝试使用名称而不是索引序号。dictcursor似乎介于两者之间,通过单独存储索引到列名的映射来节省每行的空间asks@stenci-添加了解释。RealDictCursor对于需要标题行的表和CSV也非常有用。谢谢您的回答。我想知道为什么我的输出结构像元组列表,以及如何获取JSON/dict数据。这是网站的定义。它实际上让我质疑使用RealDictCursor与使用建议的dictcursor作为默认值。我相信这一页上的注释是误导性的,它说它是非常专业的。在大多数情况下,在将响应转换为表或带有标头的csv时,返回的查询需要标头。