mirror of
https://github.com/psycopg/psycopg2.git
synced 2025-02-16 17:10:32 +03:00
parent
2bee47efac
commit
62743c3be1
1
NEWS
1
NEWS
|
@ -10,6 +10,7 @@ What's new in psycopg 2.8.5
|
||||||
`~psycopg2.extras.LoggingConnection` (:ticket:`#1026`).
|
`~psycopg2.extras.LoggingConnection` (:ticket:`#1026`).
|
||||||
- `~psycopg2.extensions.Column` objects in `cursor.description` can be sliced
|
- `~psycopg2.extensions.Column` objects in `cursor.description` can be sliced
|
||||||
(:ticket:`#1034`).
|
(:ticket:`#1034`).
|
||||||
|
- Fixed `~copy.copy()` of `~psycopg2.extras.DictCursor` rows (:ticket:`#1073`).
|
||||||
|
|
||||||
|
|
||||||
What's new in psycopg 2.8.4
|
What's new in psycopg 2.8.4
|
||||||
|
|
|
@ -196,6 +196,10 @@ class DictRow(list):
|
||||||
def __contains__(self, x):
|
def __contains__(self, x):
|
||||||
return x in self._index
|
return x in self._index
|
||||||
|
|
||||||
|
def __reduce__(self):
|
||||||
|
# this is apparently useless, but it fixes #1073
|
||||||
|
return super(DictRow, self).__reduce__()
|
||||||
|
|
||||||
def __getstate__(self):
|
def __getstate__(self):
|
||||||
return self[:], self._index.copy()
|
return self[:], self._index.copy()
|
||||||
|
|
||||||
|
@ -392,6 +396,7 @@ class NamedTupleCursor(_cursor):
|
||||||
def _cached_make_nt(cls, key):
|
def _cached_make_nt(cls, key):
|
||||||
return cls._do_make_nt(key)
|
return cls._do_make_nt(key)
|
||||||
|
|
||||||
|
|
||||||
# Exposed for testability, and if someone wants to monkeypatch to tweak
|
# Exposed for testability, and if someone wants to monkeypatch to tweak
|
||||||
# the cache size.
|
# the cache size.
|
||||||
NamedTupleCursor._cached_make_nt = classmethod(_cached_make_nt)
|
NamedTupleCursor._cached_make_nt = classmethod(_cached_make_nt)
|
||||||
|
@ -410,7 +415,8 @@ class LoggingConnection(_connection):
|
||||||
instance from the standard logging module.
|
instance from the standard logging module.
|
||||||
"""
|
"""
|
||||||
self._logobj = logobj
|
self._logobj = logobj
|
||||||
if _logging and isinstance(logobj, (_logging.Logger, _logging.LoggerAdapter)):
|
if _logging and isinstance(
|
||||||
|
logobj, (_logging.Logger, _logging.LoggerAdapter)):
|
||||||
self.log = self._logtologger
|
self.log = self._logtologger
|
||||||
else:
|
else:
|
||||||
self.log = self._logtofile
|
self.log = self._logtofile
|
||||||
|
|
|
@ -15,6 +15,7 @@
|
||||||
# FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public
|
# FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public
|
||||||
# License for more details.
|
# License for more details.
|
||||||
|
|
||||||
|
import copy
|
||||||
import time
|
import time
|
||||||
import pickle
|
import pickle
|
||||||
import unittest
|
import unittest
|
||||||
|
@ -158,6 +159,20 @@ class ExtrasDictCursorTests(_DictCursorBase):
|
||||||
self.assertEqual(r['b'], r1['b'])
|
self.assertEqual(r['b'], r1['b'])
|
||||||
self.assertEqual(r._index, r1._index)
|
self.assertEqual(r._index, r1._index)
|
||||||
|
|
||||||
|
def test_copy(self):
|
||||||
|
curs = self.conn.cursor(cursor_factory=psycopg2.extras.DictCursor)
|
||||||
|
curs.execute("select 10 as foo, 'hi' as bar")
|
||||||
|
rv = curs.fetchone()
|
||||||
|
self.assertEqual(len(rv), 2)
|
||||||
|
|
||||||
|
rv2 = copy.copy(rv)
|
||||||
|
self.assertEqual(len(rv2), 2)
|
||||||
|
self.assertEqual(len(rv), 2)
|
||||||
|
|
||||||
|
rv3 = copy.deepcopy(rv)
|
||||||
|
self.assertEqual(len(rv3), 2)
|
||||||
|
self.assertEqual(len(rv), 2)
|
||||||
|
|
||||||
@skip_from_python(3)
|
@skip_from_python(3)
|
||||||
def test_iter_methods_2(self):
|
def test_iter_methods_2(self):
|
||||||
curs = self.conn.cursor(cursor_factory=psycopg2.extras.DictCursor)
|
curs = self.conn.cursor(cursor_factory=psycopg2.extras.DictCursor)
|
||||||
|
@ -267,6 +282,20 @@ class ExtrasDictCursorRealTests(_DictCursorBase):
|
||||||
self.assertEqual(r['a'], r1['a'])
|
self.assertEqual(r['a'], r1['a'])
|
||||||
self.assertEqual(r['b'], r1['b'])
|
self.assertEqual(r['b'], r1['b'])
|
||||||
|
|
||||||
|
def test_copy(self):
|
||||||
|
curs = self.conn.cursor(cursor_factory=psycopg2.extras.RealDictCursor)
|
||||||
|
curs.execute("select 10 as foo, 'hi' as bar")
|
||||||
|
rv = curs.fetchone()
|
||||||
|
self.assertEqual(len(rv), 2)
|
||||||
|
|
||||||
|
rv2 = copy.copy(rv)
|
||||||
|
self.assertEqual(len(rv2), 2)
|
||||||
|
self.assertEqual(len(rv), 2)
|
||||||
|
|
||||||
|
rv3 = copy.deepcopy(rv)
|
||||||
|
self.assertEqual(len(rv3), 2)
|
||||||
|
self.assertEqual(len(rv), 2)
|
||||||
|
|
||||||
def testDictCursorRealWithNamedCursorFetchOne(self):
|
def testDictCursorRealWithNamedCursorFetchOne(self):
|
||||||
self._testWithNamedCursorReal(lambda curs: curs.fetchone())
|
self._testWithNamedCursorReal(lambda curs: curs.fetchone())
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue
Block a user