mirror of
https://github.com/sqlalchemy/sqlalchemy.git
synced 2026-05-29 12:06:28 -04:00
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:
+12
@@ -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.
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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):
|
||||
|
||||
|
||||
Reference in New Issue
Block a user