Fix composite array bind param process
This commit is contained in:
@@ -4,6 +4,13 @@ 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.5 (2015-05-27)
|
||||||
|
^^^^^^^^^^^^^^^^^^^
|
||||||
|
|
||||||
|
- Fixed CompositeType bind parameter processing when one of the fields is of TypeDecorator type and
|
||||||
|
CompositeType is used inside ARRAY type.
|
||||||
|
|
||||||
|
|
||||||
0.30.4 (2015-05-27)
|
0.30.4 (2015-05-27)
|
||||||
^^^^^^^^^^^^^^^^^^^
|
^^^^^^^^^^^^^^^^^^^
|
||||||
|
|
||||||
|
@@ -90,4 +90,4 @@ from .types import ( # noqa
|
|||||||
WeekDaysType
|
WeekDaysType
|
||||||
)
|
)
|
||||||
|
|
||||||
__version__ = '0.30.4'
|
__version__ = '0.30.5'
|
||||||
|
@@ -97,6 +97,7 @@ import psycopg2
|
|||||||
import sqlalchemy as sa
|
import sqlalchemy as sa
|
||||||
from psycopg2.extensions import adapt, AsIs, register_adapter
|
from psycopg2.extensions import adapt, AsIs, register_adapter
|
||||||
from sqlalchemy.dialects.postgresql import ARRAY
|
from sqlalchemy.dialects.postgresql import ARRAY
|
||||||
|
from sqlalchemy.dialects.postgresql.psycopg2 import PGDialect_psycopg2
|
||||||
from sqlalchemy.ext.compiler import compiles
|
from sqlalchemy.ext.compiler import compiles
|
||||||
from sqlalchemy.schema import _CreateDropBase
|
from sqlalchemy.schema import _CreateDropBase
|
||||||
from sqlalchemy.sql.expression import FunctionElement
|
from sqlalchemy.sql.expression import FunctionElement
|
||||||
@@ -127,7 +128,7 @@ def _compile_pgelem(expr, compiler, **kw):
|
|||||||
class CompositeArray(ARRAY):
|
class CompositeArray(ARRAY):
|
||||||
def _proc_array(self, arr, itemproc, dim, collection):
|
def _proc_array(self, arr, itemproc, dim, collection):
|
||||||
if dim is None:
|
if dim is None:
|
||||||
if issubclass(self.item_type.python_type, (list, tuple)):
|
if issubclass(self.item_type.python_type, tuple):
|
||||||
return arr
|
return arr
|
||||||
ARRAY._proc_array(self, arr, itemproc, dim, collection)
|
ARRAY._proc_array(self, arr, itemproc, dim, collection)
|
||||||
|
|
||||||
@@ -166,7 +167,6 @@ class CompositeType(UserDefinedType, SchemaType):
|
|||||||
self.columns = columns
|
self.columns = columns
|
||||||
if name in registered_composites:
|
if name in registered_composites:
|
||||||
self.type_cls = registered_composites[name].type_cls
|
self.type_cls = registered_composites[name].type_cls
|
||||||
else:
|
|
||||||
registered_composites[name] = self
|
registered_composites[name] = self
|
||||||
attach_composite_listeners()
|
attach_composite_listeners()
|
||||||
|
|
||||||
@@ -226,7 +226,14 @@ def register_psycopg2_composite(dbapi_connection, composite):
|
|||||||
|
|
||||||
def adapt_composite(value):
|
def adapt_composite(value):
|
||||||
values = [
|
values = [
|
||||||
adapt(getattr(value, column.name)).getquoted().decode('utf-8')
|
adapt(
|
||||||
|
getattr(value, column.name)
|
||||||
|
if not isinstance(column.type, TypeDecorator)
|
||||||
|
else column.type.process_bind_param(
|
||||||
|
getattr(value, column.name),
|
||||||
|
PGDialect_psycopg2()
|
||||||
|
)
|
||||||
|
).getquoted().decode('utf-8')
|
||||||
for column in
|
for column in
|
||||||
composite.columns
|
composite.columns
|
||||||
]
|
]
|
||||||
|
@@ -127,8 +127,8 @@ class TestCompositeTypeInsideArray(TestCase):
|
|||||||
def test_parameter_processing(self):
|
def test_parameter_processing(self):
|
||||||
account = self.Account(
|
account = self.Account(
|
||||||
balances=[
|
balances=[
|
||||||
self.type.type_cls('USD', 15),
|
self.type.type_cls(Currency('USD'), 15),
|
||||||
self.type.type_cls('AUD', 20)
|
self.type.type_cls(Currency('AUD'), 20)
|
||||||
]
|
]
|
||||||
)
|
)
|
||||||
|
|
||||||
|
Reference in New Issue
Block a user