Fixed pickling of RealDictRow objects

This commit is contained in:
Daniele Varrazzo 2012-12-10 23:54:08 +00:00
parent e6fbf47c46
commit 99bedd1bb2
3 changed files with 20 additions and 0 deletions

1
NEWS
View File

@ -37,6 +37,7 @@ What's new in psycopg 2.4.6
- Fixed pickling of FixedOffsetTimezone objects (ticket #135). - Fixed pickling of FixedOffsetTimezone objects (ticket #135).
- Release the GIL around PQgetResult calls after COPY (ticket #140). - Release the GIL around PQgetResult calls after COPY (ticket #140).
- Fixed empty strings handling in composite caster (ticket #141). - Fixed empty strings handling in composite caster (ticket #141).
- Fixed pickling of RealDictRow objects.
What's new in psycopg 2.4.5 What's new in psycopg 2.4.5

View File

@ -245,6 +245,13 @@ class RealDictRow(dict):
name = self._column_mapping[name] name = self._column_mapping[name]
return dict.__setitem__(self, name, value) return dict.__setitem__(self, name, value)
def __getstate__(self):
return (self.copy(), self._column_mapping[:])
def __setstate__(self, data):
self.update(data[0])
self._column_mapping = data[1]
class NamedTupleConnection(_connection): class NamedTupleConnection(_connection):
"""A connection that uses `NamedTupleCursor` automatically.""" """A connection that uses `NamedTupleCursor` automatically."""

View File

@ -205,6 +205,18 @@ class ExtrasDictCursorTests(unittest.TestCase):
for i, r in enumerate(curs): for i, r in enumerate(curs):
self.assertEqual(i + 1, curs.rownumber) self.assertEqual(i + 1, curs.rownumber)
def testPickleRealDictRow(self):
import pickle
curs = self.conn.cursor(cursor_factory=psycopg2.extras.RealDictCursor)
curs.execute("select 10 as a, 20 as b")
r = curs.fetchone()
d = pickle.dumps(r)
r1 = pickle.loads(d)
self.assertEqual(r, r1)
self.assertEqual(r['a'], r1['a'])
self.assertEqual(r['b'], r1['b'])
self.assertEqual(r._column_mapping, r1._column_mapping)
class NamedTupleCursorTest(unittest.TestCase): class NamedTupleCursorTest(unittest.TestCase):
def setUp(self): def setUp(self):