diff --git a/NEWS b/NEWS index ed38fc46..ad973cf3 100644 --- a/NEWS +++ b/NEWS @@ -8,6 +8,8 @@ What's new in psycopg 2.4.3 - Lazy import of the slow uuid module, thanks to Marko Kreen. - Fixed NamedTupleCursor.executemany() (ticket #65). - Fixed --static-libpq setup option (ticket #64). + - Fixed interaction between RealDictCursor and named cursors + (ticket #67). - 'errorcodes' map updated to PostgreSQL 9.1. diff --git a/lib/extras.py b/lib/extras.py index 0d7bc981..c6a2504f 100644 --- a/lib/extras.py +++ b/lib/extras.py @@ -237,6 +237,10 @@ class RealDictRow(dict): def __init__(self, cursor): dict.__init__(self) + # Required for named cursors + if cursor.description and not cursor.column_mapping: + cursor._build_index() + self._column_mapping = cursor.column_mapping def __setitem__(self, name, value): diff --git a/tests/extras_dictcursor.py b/tests/extras_dictcursor.py index c74075b0..0af5afd9 100755 --- a/tests/extras_dictcursor.py +++ b/tests/extras_dictcursor.py @@ -80,6 +80,21 @@ class ExtrasDictCursorTests(unittest.TestCase): return row self._testWithNamedCursor(getter) + def testDictCursorRealWithNamedCursorFetchOne(self): + self._testWithNamedCursorReal(lambda curs: curs.fetchone()) + + def testDictCursorRealWithNamedCursorFetchMany(self): + self._testWithNamedCursorReal(lambda curs: curs.fetchmany(100)[0]) + + def testDictCursorRealWithNamedCursorFetchAll(self): + self._testWithNamedCursorReal(lambda curs: curs.fetchall()[0]) + + def testDictCursorRealWithNamedCursorIter(self): + def getter(curs): + for row in curs: + return row + self._testWithNamedCursorReal(getter) + def _testWithPlainCursor(self, getter): curs = self.conn.cursor(cursor_factory=psycopg2.extras.DictCursor) curs.execute("SELECT * FROM ExtrasDictCursorTests")