【问题标题】:Cursor when returning dictionary and print where are the keys返回字典时的光标并打印键在哪里
【发布时间】:2015-10-01 20:09:20
【问题描述】:

我想了解游标返回的数据结构

我有以下代码:

con = psycopg2.connect("dbname='testdb2' user='kevin'") 

cursor = con.cursor(cursor_factory=psycopg2.extras.DictCursor)
cursor.execute("SELECT * FROM Cars")

rows = cursor.fetchall()

for row in rows:
    print row["id"], row["name"], row["price"]

哪些输出:

1 奥迪 52642

2 梅赛德斯 57127

3 斯柯达 9000

等等……

如果我说

for row in rows:
    print rows

输出

[[1, 'Audi', 52642], [2, 'Mercedes', 57127], [3, 'Skoda', 9000], [4, 'Volvo', 29000], [5, 'Bentley', 350000], [6, 'Citroen', 21000], [7, 'Hummer', 41400], [8, 'Volkswagen', 21600]]

钥匙在哪里?我期待这样的输出

[['Id': '1' , 'name':'Audi', 'price:'52642'], ['Id': '2' , 'name':'Mercedes', 'price:'57127'] ....etc

我不确定是不是因为我对 python 缺乏了解,所以我确实期望该输出。

【问题讨论】:

    标签: python postgresql cursor psycopg2


    【解决方案1】:

    每一行都是一个DictRow,它继承自list

    https://github.com/psycopg/psycopg2/blob/master/lib/extras.py

    class DictRow(list):
        """A row object that allow by-column-name access to data."""
    
        __slots__ = ('_index',)
    
        def __init__(self, cursor):
            self._index = cursor.index
            self[:] = [None] * len(cursor.description)
    
        def __getitem__(self, x):
            if not isinstance(x, (int, slice)):
                x = self._index[x]
            return list.__getitem__(self, x)
    
        def __setitem__(self, x, v):
            if not isinstance(x, (int, slice)):
                x = self._index[x]
            list.__setitem__(self, x, v)
    
        def items(self):
            return list(self.iteritems())
    
        def keys(self):
            return self._index.keys()
    
        def values(self):
            return tuple(self[:])
    
        def has_key(self, x):
            return x in self._index
    
        def get(self, x, default=None):
            try:
                return self[x]
            except:
                return default
    
        def iteritems(self):
            for n, v in self._index.iteritems():
                yield n, list.__getitem__(self, v)
    
        def iterkeys(self):
            return self._index.iterkeys()
    
        def itervalues(self):
            return list.__iter__(self)
    
        def copy(self):
            return dict(self.iteritems())
    
        def __contains__(self, x):
            return x in self._index
    
        def __getstate__(self):
            return self[:], self._index.copy()
    
        def __setstate__(self, data):
            self[:] = data[0]
            self._index = data[1]
    
        if _sys.version_info[0] > 2:
            items = iteritems; del iteritems
            keys = iterkeys; del iterkeys
            values = itervalues; del itervalues
            del has_key
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-01-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-11-06
      • 2015-07-13
      相关资源
      最近更新 更多