簡體   English   中英

psycopg2:DictCursor 與 RealDictCursor

[英]psycopg2: DictCursor vs RealDictCursor

AFAIU 和來自 docs, RealDictCursor是一個專門的DictCursor ,它只允許從鍵(又名列名)訪問列,而DictCursor允許從鍵或索引號訪問數據。
我想知道如果RealDictCursor提供更大的靈活性,為什么要實施DictCursor 性能方面(或內存方面)是否如此不同(我想支持RealDictCursor ......)?
換句話說, RealDictCursor用例與DictCursor是什么?

真正的字典游標的主要優點是很容易將查詢輸出為 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,並且需要上面顯示的轉換。 另一方面,真正的字典光標會產生更大的結果,因此如果您真的不需要它,則不應使用它。

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

使用真正的字典作為行的基本類型的游標。 請注意,此游標非常專業,不允許正常訪問(使用整數索引)來獲取數據。 如果您需要以字典和列表的形式訪問數據庫行,請使用通用DictCursor而不是RealDictCursor 類 psycopg2.extras。 RealDictConnection自動使用RealDictCursor的連接。

注意自 Psycopg2.5 以來不是很有用:您可以使用 psycopg2.connect(dsn, cursor_factory= RealDictCursor ) 而不是RealDictConnection 類 psycopg2.extras。 RealDictRow (cursor) 表示數據記錄的 dict 子類。


暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM