summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMike Bayer <mike_mp@zzzcomputing.com>2014-05-10 23:26:09 -0400
committerMike Bayer <mike_mp@zzzcomputing.com>2014-05-10 23:26:09 -0400
commit230c0d5a19978872fae4e1261736a9e300ae9bf1 (patch)
tree40fae1f4feb8ddb43713c802b132d6377dc9cbd8
parent168ca1d37d0d6ddc3ef6dc993fa561c4f46d0f52 (diff)
downloadsqlalchemy-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.rst10
-rw-r--r--lib/sqlalchemy/orm/base.py5
-rw-r--r--test/orm/test_mapper.py35
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