Ignore non-primary mappers within mutable instrumentation

Fixed bug where using :meth:`.Mutable.associate_with` or
:meth:`.Mutable.as_mutable` in conjunction with a class that has non-
primary mappers set up with alternatively-named attributes would produce an
attribute error.  Since non-primary mappers are not used for persistence,
the mutable extension now excludes non-primary mappers from its
instrumentation steps.

Change-Id: I2630d9f771a171aece03181ccf9159885f68f25e
Fixes: #4215
(cherry picked from commit 0fd508ad32)
This commit is contained in:
Mike Bayer
2018-03-12 12:50:52 -04:00
parent b8a928e529
commit aeb825fef7
3 changed files with 38 additions and 0 deletions
+12
View File
@@ -0,0 +1,12 @@
.. change::
:tags: bug, orm
:tickets: 4215
:versions: 1.3.0b1
Fixed bug where using :meth:`.Mutable.associate_with` or
:meth:`.Mutable.as_mutable` in conjunction with a class that has non-
primary mappers set up with alternatively-named attributes would produce an
attribute error. Since non-primary mappers are not used for persistence,
the mutable extension now excludes non-primary mappers from its
instrumentation steps.
+4
View File
@@ -566,6 +566,8 @@ class Mutable(MutableBase):
"""
def listen_for_type(mapper, class_):
if mapper.non_primary:
return
for prop in mapper.column_attrs:
if isinstance(prop.columns[0].type, sqltype):
cls.associate_with_attribute(getattr(class_, prop.key))
@@ -619,6 +621,8 @@ class Mutable(MutableBase):
schema_event_check = False
def listen_for_type(mapper, class_):
if mapper.non_primary:
return
for prop in mapper.column_attrs:
if (
schema_event_check and
+22
View File
@@ -801,6 +801,17 @@ class MutableWithScalarJSONTest(_MutableDictTestBase, fixtures.MappedTest):
self._test_non_mutable()
class MutableIncludeNonPrimaryTest(MutableWithScalarJSONTest):
@classmethod
def setup_mappers(cls):
foo = cls.tables.foo
mapper(Foo, foo)
mapper(Foo, foo, non_primary=True, properties={
"foo_bar": foo.c.data
})
class MutableColumnCopyJSONTest(_MutableDictTestBase, fixtures.MappedTest):
@classmethod
@@ -967,6 +978,17 @@ class MutableAssociationScalarPickleTest(_MutableDictTestBase,
)
class MutableAssocIncludeNonPrimaryTest(MutableAssociationScalarPickleTest):
@classmethod
def setup_mappers(cls):
foo = cls.tables.foo
mapper(Foo, foo)
mapper(Foo, foo, non_primary=True, properties={
"foo_bar": foo.c.data
})
class MutableAssociationScalarJSONTest(_MutableDictTestBase,
fixtures.MappedTest):