diff options
author | Mike Bayer <mike_mp@zzzcomputing.com> | 2014-05-10 23:26:09 -0400 |
---|---|---|
committer | Mike Bayer <mike_mp@zzzcomputing.com> | 2014-05-10 23:26:09 -0400 |
commit | 230c0d5a19978872fae4e1261736a9e300ae9bf1 (patch) | |
tree | 40fae1f4feb8ddb43713c802b132d6377dc9cbd8 | |
parent | 168ca1d37d0d6ddc3ef6dc993fa561c4f46d0f52 (diff) | |
download | sqlalchemy-230c0d5a19978872fae4e1261736a9e300ae9bf1.tar.gz |
- 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
-rw-r--r-- | doc/build/changelog/changelog_08.rst | 10 | ||||
-rw-r--r-- | lib/sqlalchemy/orm/base.py | 5 | ||||
-rw-r--r-- | test/orm/test_mapper.py | 35 |
3 files changed, 48 insertions, 2 deletions
diff --git a/doc/build/changelog/changelog_08.rst b/doc/build/changelog/changelog_08.rst index 656858720..c87c5eb6e 100644 --- a/doc/build/changelog/changelog_08.rst +++ b/doc/build/changelog/changelog_08.rst @@ -12,6 +12,16 @@ :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 :versions: 0.9.5 diff --git a/lib/sqlalchemy/orm/base.py b/lib/sqlalchemy/orm/base.py index e973de897..e81375787 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 78f563b70..40891e0d8 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 |