.. changelog::
:version: 0.8.7
+ .. change::
+ :tags: bug, orm
+ :tickets: 3047
+ :versions: 0.9.5
+
+ Fixed ORM bug where the :func:`.class_mapper` function would mask
+ AttributeErrors or KeyErrors that should raise during mapper
+ configuration due to user errors. The catch for attribute/keyerror
+ has been made more specific to not include the configuration step.
+
.. change::
:tags: bug, sql
:tickets: 3045
if not class_manager.is_mapped:
return None
mapper = class_manager.mapper
+ except exc.NO_STATE:
+ return None
+ else:
if configure and mapperlib.module._new_mappers:
mapperlib.configure_mappers()
return mapper
- except exc.NO_STATE:
- return None
-
def object_mapper(instance):
"""Given an object, return the primary Mapper associated with the object
class_mapper, (5, 6)
)
+ def test_attribute_error_raised_class_mapper(self):
+ users = self.tables.users
+ addresses = self.tables.addresses
+ User = self.classes.User
+ Address = self.classes.Address
+
+ mapper(User, users, properties={
+ "addresses": relationship(Address,
+ primaryjoin=lambda: users.c.id == addresses.wrong.user_id)
+ })
+ mapper(Address, addresses)
+ assert_raises_message(
+ AttributeError,
+ "'Table' object has no attribute 'wrong'",
+ class_mapper, Address
+ )
+
+ def test_key_error_raised_class_mapper(self):
+ users = self.tables.users
+ addresses = self.tables.addresses
+ User = self.classes.User
+ Address = self.classes.Address
+
+ mapper(User, users, properties={
+ "addresses": relationship(Address,
+ primaryjoin=lambda: users.c.id ==
+ addresses.__dict__['wrong'].user_id)
+ })
+ mapper(Address, addresses)
+ assert_raises_message(
+ KeyError,
+ "wrong",
+ class_mapper, Address
+ )
+
def test_unmapped_subclass_error_postmap(self):
users = self.tables.users