From: RamonWill Date: Thu, 6 Aug 2020 20:08:13 +0000 (-0400) Subject: Provide more detailed error message for Query.join() X-Git-Tag: rel_1_3_20~30^2 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=2cc963dbdc4fc4e0bd2c0bb7cdecdcc84ac8f629;p=thirdparty%2Fsqlalchemy%2Fsqlalchemy.git Provide more detailed error message for Query.join() An :class:`.ArgumentError` with more detail is now raised if the target parameter for :meth:`_query.Query.join` is set to an unmapped object. Prior to this change a less detailed ``AttributeError`` was raised. Pull request courtesy Ramon Williams. Fixes: #4428 Closes: #5452 Pull-request: https://github.com/sqlalchemy/sqlalchemy/pull/5452 Pull-request-sha: b148df547037e9a254fe331eff8e922c78426261 Change-Id: I873453d1fdb651178216aac698baac63ae5a94e8 --- diff --git a/doc/build/changelog/unreleased_13/4428.rst b/doc/build/changelog/unreleased_13/4428.rst new file mode 100644 index 0000000000..e677669976 --- /dev/null +++ b/doc/build/changelog/unreleased_13/4428.rst @@ -0,0 +1,8 @@ +.. change:: + :tags: bug, orm + :tickets: 4428 + + An :class:`.ArgumentError` with more detail is now raised if the target + parameter for :meth:`_query.Query.join` is set to an unmapped object. + Prior to this change a less detailed ``AttributeError`` was raised. + Pull request courtesy Ramon Williams. diff --git a/lib/sqlalchemy/orm/query.py b/lib/sqlalchemy/orm/query.py index c62f6a9025..8f4b3b0aca 100644 --- a/lib/sqlalchemy/orm/query.py +++ b/lib/sqlalchemy/orm/query.py @@ -2512,7 +2512,18 @@ class Query(object): if of_type: right = of_type else: - right = onclause.property.entity + right = onclause.property + + try: + right = right.entity + except AttributeError as err: + util.raise_( + sa_exc.ArgumentError( + "Join target %s does not refer to a " + "mapped entity" % right + ), + replace_context=err, + ) left = onclause._parententity diff --git a/test/orm/test_joins.py b/test/orm/test_joins.py index aaa96ae4ad..845c6e6f24 100644 --- a/test/orm/test_joins.py +++ b/test/orm/test_joins.py @@ -2400,6 +2400,20 @@ class JoinTest(QueryTest, AssertsCompiledSQL): User.id == Address.user_id, ) + def test_on_clause_no_right_side_two(self): + User = self.classes.User + Address = self.classes.Address + sess = create_session() + + right = Address.user_id + + assert_raises_message( + sa_exc.ArgumentError, + "Join target %s does not refer to a mapped entity" % right, + sess.query(User).join, + Address.user_id, + ) + def test_select_from(self): """Test that the left edge of the join can be set reliably with select_from()."""