Fix CompositeType

Fix CompositeType bind parameter processing when of the fields is
of TypeDecorator type.
This commit is contained in:
Konsta Vesterinen
2015-05-27 13:53:33 +03:00
parent 5de59d622d
commit eed5018629
4 changed files with 35 additions and 2 deletions

View File

@@ -4,6 +4,12 @@ Changelog
Here you can see the full list of changes between each SQLAlchemy-Utils release. Here you can see the full list of changes between each SQLAlchemy-Utils release.
0.30.4 (2015-05-27)
^^^^^^^^^^^^^^^^^^^
- Fixed CompositeType bind parameter processing when one of the fields is of TypeDecorator type.
0.30.3 (2015-05-27) 0.30.3 (2015-05-27)
^^^^^^^^^^^^^^^^^^^ ^^^^^^^^^^^^^^^^^^^

View File

@@ -90,4 +90,4 @@ from .types import ( # noqa
WeekDaysType WeekDaysType
) )
__version__ = '0.30.3' __version__ = '0.30.4'

View File

@@ -173,6 +173,21 @@ class CompositeType(UserDefinedType, SchemaType):
def get_col_spec(self): def get_col_spec(self):
return self.name return self.name
def bind_processor(self, dialect):
def process(value):
processed_value = []
for i, column in enumerate(self.columns):
if isinstance(column.type, TypeDecorator):
processed_value.append(
column.type.process_bind_param(
value[i], dialect
)
)
else:
processed_value.append(value[i])
return tuple(processed_value)
return process
def result_processor(self, dialect, coltype): def result_processor(self, dialect, coltype):
def process(value): def process(value):
cls = value.__class__ cls = value.__class__

View File

@@ -73,7 +73,7 @@ class TestCompositeTypeWithTypeDecorators(TestCase):
self.Account = Account self.Account = Account
def test_parameter_processing(self): def test_result_set_processing(self):
account = self.Account( account = self.Account(
balance=('USD', 15) balance=('USD', 15)
) )
@@ -85,6 +85,18 @@ class TestCompositeTypeWithTypeDecorators(TestCase):
assert account.balance.currency == Currency('USD') assert account.balance.currency == Currency('USD')
assert account.balance.amount == 15 assert account.balance.amount == 15
def test_parameter_processing(self):
account = self.Account(
balance=(Currency('USD'), 15)
)
self.session.add(account)
self.session.commit()
account = self.session.query(self.Account).first()
assert account.balance.currency == Currency('USD')
assert account.balance.amount == 15
@mark.skipif('babel is None') @mark.skipif('babel is None')
class TestCompositeTypeInsideArray(TestCase): class TestCompositeTypeInsideArray(TestCase):