Re: iterating over DictRow
От | Adrian Klaver |
---|---|
Тема | Re: iterating over DictRow |
Дата | |
Msg-id | 9f9f7536-9d5f-d95b-b1eb-eed7ec1b83f6@aklaver.com обсуждение исходный текст |
Ответ на | Re: iterating over DictRow (Karsten Hilbert <Karsten.Hilbert@gmx.net>) |
Ответы |
Re: iterating over DictRow
|
Список | psycopg |
On 9/24/20 2:11 PM, Karsten Hilbert wrote: > On Thu, Sep 24, 2020 at 02:53:40PM +0000, David Raymond wrote: > >> Since DictRow's can be indexed by either the field name or >> the field index (either record["ID"] or record[0]) then I >> think what it "should" be is a little ambiguous. > > I eventually thought so. I was, however, wondering whether I > should have _expected_ iteration over a DictRow to be a list > iteration. Maybe. The issue is as below. Thanks to Maurice Meyer's answer to this SO question: https://stackoverflow.com/questions/63200437/psycopg2-extras-dictrow-behaves-differently-using-for-vs-next/63200557#63200557 for pointing me in the right direction. https://github.com/psycopg/psycopg2/blob/fbba461052ae6ebc43167ab69ad91cadb7914c83/lib/extras.py class DictRow(list): ... def __getitem__(self, x): if not isinstance(x, (int, slice)): x = self._index[x] return super(DictRow, self).__getitem__(x) So if the value passed to __getitem__() is a integer or slice it does a list index. So: con = psycopg2.connect("dbname=production host=localhost user=postgres", cursor_factory=DictCursor) cur = con.cursor() cur.execute("select * from cell_per") rs = cur.fetchall() type(rs) list r0 = rs[0] type(r0) psycopg2.extras.DictRow for fld in r0.__iter__(): print(fld) 5 H PREM 3.5 18 None 2004-06-02 15:11:26 None postgres herb none HP3 What you where trying: for fld in r0: print(r0[fld]) KeyError: 'H PREM 3.5' So the 5 works because there are at least 6 items in the record. The 'H PREM 3.5' fails because it is a value not a key. cur.execute("select cell_per from cell_per") rs = cur.fetchall() r0 = rs[0] r0 [18] for fld in r0: print(r0[fld]) IndexError: list index out of range Fails as there are not 19 items in the DictRow. > > Either of those > >> for field in dict(the_dict): >> for field in the_dict.keys(): > > work, however (or RealDictCursor, for that matter). > > Thanks all, > Karsten > -- > GPG 40BE 5B0E C98E 1713 AFA6 5BC0 3BEA AC80 7D4F C89B > > -- Adrian Klaver adrian.klaver@aklaver.com
В списке psycopg по дате отправления: