From d67d50b4342ee45b8a65d798be7d7d4b183fa593 Mon Sep 17 00:00:00 2001 From: Daniele Varrazzo Date: Mon, 12 Sep 2011 02:20:53 +0100 Subject: [PATCH] Fixed interaction between RealDictCursor and named cursors Closes ticket #67. --- NEWS | 2 ++ lib/extras.py | 4 ++++ tests/extras_dictcursor.py | 15 +++++++++++++++ 3 files changed, 21 insertions(+) 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")