From 430ce5eab26d46301ae741f9068f13ba09907d8e Mon Sep 17 00:00:00 2001 From: Mike Bayer Date: Sun, 19 Apr 2020 16:52:54 -0400 Subject: Raise informative error when non-object m2o comparison used An informative error message is raised when an ORM many-to-one comparison is attempted against an object that is not an actual mapped instance. Comparisons such as those to scalar subqueries aren't supported; generalized comparison with subqueries is better achieved using :meth:`~.RelationshipProperty.Comparator.has`. Fixes: #5269 Change-Id: I2e23178eb59728c39241a46bfa7411239a87492e --- lib/sqlalchemy/orm/relationships.py | 13 ++++++++++++- 1 file changed, 12 insertions(+), 1 deletion(-) (limited to 'lib/sqlalchemy') diff --git a/lib/sqlalchemy/orm/relationships.py b/lib/sqlalchemy/orm/relationships.py index 7d33c4649..6ac56a324 100644 --- a/lib/sqlalchemy/orm/relationships.py +++ b/lib/sqlalchemy/orm/relationships.py @@ -1621,8 +1621,19 @@ class RelationshipProperty(StrategizedProperty): alias_secondary=True, ): if state is not None: - state = attributes.instance_state(state) + try: + state = inspect(state) + except sa_exc.NoInspectionAvailable: + state = None + if state is None or not getattr(state, "is_instance", False): + raise sa_exc.ArgumentError( + "Mapped instance expected for relationship " + "comparison to object. Classes, queries and other " + "SQL elements are not accepted in this context; for " + "comparison with a subquery, " + "use %s.has(**criteria)." % self + ) reverse_direction = not value_is_parent if state is None: -- cgit v1.2.1