From: Mike Bayer Date: Wed, 27 Apr 2011 16:51:50 +0000 (-0400) Subject: - a non_primary mapper will inherit the _identity_class X-Git-Tag: rel_0_6_8~18 X-Git-Url: http://git.ipfire.org/gitweb.cgi?a=commitdiff_plain;h=7eb29add0557371020a55fecc82d7d4c45575fcb;p=thirdparty%2Fsqlalchemy%2Fsqlalchemy.git - a non_primary mapper will inherit the _identity_class of the primary mapper. This so that a non_primary established against a class that's normally in an inheritance mapping will produce results that are identity-map compatible with that of the primary mapper [ticket:2151] --- diff --git a/CHANGES b/CHANGES index 4fa2fe702f..c632465a29 100644 --- a/CHANGES +++ b/CHANGES @@ -10,6 +10,13 @@ CHANGES invalid, this condition now raises a deprecation warning. [ticket:2144] + - a non_primary mapper will inherit the _identity_class + of the primary mapper. This so that a non_primary + established against a class that's normally in an + inheritance mapping will produce results that are + identity-map compatible with that of the primary + mapper [ticket:2151] + - sql - Fixed bug whereby if FetchedValue was passed to column server_onupdate, it would not diff --git a/lib/sqlalchemy/orm/mapper.py b/lib/sqlalchemy/orm/mapper.py index 1f5e30f818..07be0b746e 100644 --- a/lib/sqlalchemy/orm/mapper.py +++ b/lib/sqlalchemy/orm/mapper.py @@ -376,6 +376,7 @@ class Mapper(object): "a primary mapper first before setting up a non primary " "Mapper." % self.class_) self.class_manager = manager + self._identity_class = manager.mapper._identity_class _mapper_registry[self] = True return diff --git a/test/orm/test_mapper.py b/test/orm/test_mapper.py index d25fb2826b..4c82bc50b7 100644 --- a/test/orm/test_mapper.py +++ b/test/orm/test_mapper.py @@ -450,6 +450,19 @@ class MapperTest(_fixtures.FixtureTest): assert n1.children[0] is n1._children[0] is n2 eq_(str(Node.parent == n2), ":param_1 = nodes.parent_id") + @testing.resolve_artifact_names + def test_non_primary_identity_class(self): + class AddressUser(User): + pass + m1 = mapper(User, users, polymorphic_identity='user') + m2 = mapper(AddressUser, addresses, inherits=User, polymorphic_identity='address') + m3 = mapper(AddressUser, addresses, non_primary=True) + assert m3._identity_class is m2._identity_class + eq_( + m2.identity_key_from_instance(AddressUser()), + m3.identity_key_from_instance(AddressUser()) + ) + @testing.resolve_artifact_names def test_illegal_non_primary(self): mapper(User, users)