summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authormike bayer <mike_mp@zzzcomputing.com>2020-05-23 21:11:50 +0000
committerGerrit Code Review <gerrit@bbpush.zzzcomputing.com>2020-05-23 21:11:50 +0000
commit56f302138622b868a9f6fc63d4f080e5c237dd3e (patch)
tree294dda86754234fcf9765a09157560fd382e88cc
parent330381a3312394d9663d157182cf97cea8b43fcc (diff)
parent8c10e29dc7aa2356d0f3f5110b2c9dade9d87096 (diff)
downloadsqlalchemy-56f302138622b868a9f6fc63d4f080e5c237dd3e.tar.gz
Merge "Improve error message when using :meth:`_query.Query.filter_by` in a query where the first entity is not a mapped class."
-rw-r--r--doc/build/changelog/unreleased_13/5260.rst6
-rw-r--r--lib/sqlalchemy/orm/query.py11
-rw-r--r--test/orm/test_query.py12
3 files changed, 28 insertions, 1 deletions
diff --git a/doc/build/changelog/unreleased_13/5260.rst b/doc/build/changelog/unreleased_13/5260.rst
new file mode 100644
index 000000000..18e1ddeb0
--- /dev/null
+++ b/doc/build/changelog/unreleased_13/5260.rst
@@ -0,0 +1,6 @@
+.. change::
+ :tags: usecase, orm
+ :tickets: 5326
+
+ Improve error message when using :meth:`_query.Query.filter_by` in
+ a query where the first entity is not a mapped class.
diff --git a/lib/sqlalchemy/orm/query.py b/lib/sqlalchemy/orm/query.py
index 02cfbfcb2..7e65f26e2 100644
--- a/lib/sqlalchemy/orm/query.py
+++ b/lib/sqlalchemy/orm/query.py
@@ -1784,8 +1784,17 @@ class Query(Generative):
"""
+ zero = self._joinpoint_zero()
+ if zero is None:
+ raise sa_exc.InvalidRequestError(
+ "Can't use filter_by when the first entity '%s' of a query "
+ "is not a mapped class. Please use the filter method instead, "
+ "or change the order of the entities in the query"
+ % self._query_entity_zero()
+ )
+
clauses = [
- _entity_descriptor(self._joinpoint_zero(), key) == value
+ _entity_descriptor(zero, key) == value
for key, value in kwargs.items()
]
return self.filter(*clauses)
diff --git a/test/orm/test_query.py b/test/orm/test_query.py
index 150b406e7..8943bfc1f 100644
--- a/test/orm/test_query.py
+++ b/test/orm/test_query.py
@@ -3345,6 +3345,18 @@ class FilterTest(QueryTest, AssertsCompiledSQL):
"AS users_name FROM users WHERE name='ed'",
)
+ def test_filter_by_non_entity(self):
+ s = create_session()
+ e = sa.func.count(123)
+ assert_raises_message(
+ sa_exc.InvalidRequestError,
+ r"Can't use filter_by when the first entity 'count\(:count_1\)' of"
+ " a query is not a mapped class. Please use the filter method "
+ "instead, or change the order of the entities in the query",
+ s.query(e).filter_by,
+ col=42,
+ )
+
class HasAnyTest(fixtures.DeclarativeMappedTest, AssertsCompiledSQL):
__dialect__ = "default"