Merge branch 'master' into nul-terminator

This commit is contained in:
Daniele Varrazzo 2016-08-07 02:49:13 +01:00
commit bd95269c69
4 changed files with 25 additions and 1 deletions

6
NEWS
View File

@ -21,6 +21,12 @@ New features:
- Added `~connection.get_dsn_parameters()` connection method (:ticket:`#364`). - Added `~connection.get_dsn_parameters()` connection method (:ticket:`#364`).
What's new in psycopg 2.6.3
^^^^^^^^^^^^^^^^^^^^^^^^^^^
- Make `~psycopg2.extras.Range` objects picklable (:ticket:`#462`).
What's new in psycopg 2.6.2 What's new in psycopg 2.6.2
^^^^^^^^^^^^^^^^^^^^^^^^^^^ ^^^^^^^^^^^^^^^^^^^^^^^^^^^

View File

@ -73,7 +73,7 @@ Why does `!cursor.execute()` raise the exception *can't adapt*?
I can't pass an integer or a float parameter to my query: it says *a number is required*, but *it is* a number! I can't pass an integer or a float parameter to my query: it says *a number is required*, but *it is* a number!
In your query string, you always have to use ``%s`` placeholders, In your query string, you always have to use ``%s`` placeholders,
event when passing a number. All Python objects are converted by Psycopg even when passing a number. All Python objects are converted by Psycopg
in their SQL representation, so they get passed to the query as strings. in their SQL representation, so they get passed to the query as strings.
See :ref:`query-parameters`. :: See :ref:`query-parameters`. ::

View File

@ -171,6 +171,17 @@ class Range(object):
else: else:
return self.__gt__(other) return self.__gt__(other)
def __getstate__(self):
return dict(
(slot, getattr(self, slot))
for slot in self.__slots__
if hasattr(self, slot)
)
def __setstate__(self, state):
for slot, value in state.items():
setattr(self, slot, value)
def register_range(pgrange, pyrange, conn_or_curs, globally=False): def register_range(pgrange, pyrange, conn_or_curs, globally=False):
"""Create and register an adapter and the typecasters to convert between """Create and register an adapter and the typecasters to convert between

View File

@ -20,6 +20,7 @@ import sys
from decimal import Decimal from decimal import Decimal
from datetime import date, datetime from datetime import date, datetime
from functools import wraps from functools import wraps
from pickle import dumps, loads
from testutils import unittest, skip_if_no_uuid, skip_before_postgres from testutils import unittest, skip_if_no_uuid, skip_before_postgres
from testutils import ConnectingTestCase, decorate_all_tests from testutils import ConnectingTestCase, decorate_all_tests
@ -1397,6 +1398,12 @@ class RangeTestCase(unittest.TestCase):
with py3_raises_typeerror(): with py3_raises_typeerror():
self.assert_(Range(1, 2) >= 1) self.assert_(Range(1, 2) >= 1)
def test_pickling(self):
from psycopg2.extras import Range
r = Range(0, 4)
self.assertEqual(loads(dumps(r)), r)
def skip_if_no_range(f): def skip_if_no_range(f):
@wraps(f) @wraps(f)