psycopg2.extras.DictRow
уже реализует / обертывает ваши вызовы next(...)
и поставляется с функцией __inter__
, которая подготавливает и заполняет DictRow
( source ).
Как вы можете см. в реализации функции _build_index
он заполняет OrderedDict
. При наведении курсора создается (заполненный) _index
для каждого DictRow
:
pgconn = psycopg2.connect("dbname=mf port=5959 host=localhost user=mf_usr")
curs = pgconn.cursor(cursor_factory=psycopg2.extras.DictCursor)
curs.execute("select * from users where id > 366200 and id < 366203")
for r in curs:
print(r._index)
Out:
OrderedDict([('id', 0), ('firstname', 1), ('lastname', 2), ('birth', 3), ('ua', 4), ('nationality', 5)])
OrderedDict([('id', 0), ('firstname', 1), ('lastname', 2), ('birth', 3), ('ua', 4), ('nationality', 5)])
Использование next(...)
«извне» ведет себя странно и не использует __iter__
, поэтому вы получаете пустой индекс, поэтому KeyError
падает в:
...
curs.execute("select * from users where id > 366200 and id < 366203")
row = next(curs, None)
print(row._index)
Out:
OrderedDict()