From: Mike Bayer Date: Wed, 27 Apr 2011 16:54:15 +0000 (-0400) Subject: - a non_primary mapper will inherit the _identity_class X-Git-Tag: rel_0_7_0~28 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=7df21e5a1f252ff768f684132db95bd1b5e78efa;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] (also in 0.6.8) --- diff --git a/CHANGES b/CHANGES index cc96f18b50..69994c84b9 100644 --- a/CHANGES +++ b/CHANGES @@ -31,6 +31,13 @@ CHANGES - horizontal shard query should use execution options per connection as per [ticket:2131] + - 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] (also in 0.6.8) + - sql - Some improvements to error handling inside of the execute procedure to ensure auto-close diff --git a/lib/sqlalchemy/orm/mapper.py b/lib/sqlalchemy/orm/mapper.py index c91003fd9d..53f8af0b4e 100644 --- a/lib/sqlalchemy/orm/mapper.py +++ b/lib/sqlalchemy/orm/mapper.py @@ -589,6 +589,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 7d154de629..9929886ab3 100644 --- a/test/orm/test_mapper.py +++ b/test/orm/test_mapper.py @@ -474,6 +474,21 @@ class MapperTest(_fixtures.FixtureTest): assert n1.children[0] is n1._children[0] is n2 eq_(str(Node.parent == n2), ":param_1 = nodes.parent_id") + def test_non_primary_identity_class(self): + User = self.classes.User + users, addresses = self.tables.users, self.tables.addresses + 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()) + ) + def test_illegal_non_primary(self): users, Address, addresses, User = (self.tables.users, self.classes.Address,