From: Mike Bayer Date: Sun, 11 May 2014 03:26:09 +0000 (-0400) Subject: - Fixed ORM bug where the :func:`.class_mapper` function would mask X-Git-Tag: rel_0_9_5~62 X-Git-Url: http://git.ipfire.org/gitweb.cgi?a=commitdiff_plain;h=230c0d5a19978872fae4e1261736a9e300ae9bf1;p=thirdparty%2Fsqlalchemy%2Fsqlalchemy.git - 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. fixes #3047 --- diff --git a/doc/build/changelog/changelog_08.rst b/doc/build/changelog/changelog_08.rst index 656858720c..c87c5eb6eb 100644 --- a/doc/build/changelog/changelog_08.rst +++ b/doc/build/changelog/changelog_08.rst @@ -11,6 +11,16 @@ .. 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 diff --git a/lib/sqlalchemy/orm/base.py b/lib/sqlalchemy/orm/base.py index e973de8972..e81375787c 100644 --- a/lib/sqlalchemy/orm/base.py +++ b/lib/sqlalchemy/orm/base.py @@ -351,12 +351,13 @@ def _inspect_mapped_class(class_, configure=False): if not class_manager.is_mapped: return None mapper = class_manager.mapper + except exc.NO_STATE: + return None + else: if configure and mapper._new_mappers: mapper._configure_all() return mapper - except exc.NO_STATE: - return None def class_mapper(class_, configure=True): """Given a class, return the primary :class:`.Mapper` associated diff --git a/test/orm/test_mapper.py b/test/orm/test_mapper.py index 78f563b702..40891e0d8a 100644 --- a/test/orm/test_mapper.py +++ b/test/orm/test_mapper.py @@ -1590,6 +1590,41 @@ class MapperTest(_fixtures.FixtureTest, AssertsCompiledSQL): 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