summaryrefslogtreecommitdiff
path: root/lib/sqlalchemy/orm/evaluator.py
diff options
context:
space:
mode:
authorMike Bayer <mike_mp@zzzcomputing.com>2017-09-10 00:01:18 -0400
committerMike Bayer <mike_mp@zzzcomputing.com>2017-09-10 00:01:18 -0400
commitdb170dd4529c5176d38db649dd75427a932b47fe (patch)
treef7f25635bb520f34aa4d2b22d63d06592b58a00a /lib/sqlalchemy/orm/evaluator.py
parentca2c42df6ba108289031ccecd030b7aa196a66d6 (diff)
downloadsqlalchemy-ticket_4073.tar.gz
Warn instead of raise for unmapped column that matches on keyticket_4073
Modified the change made to the ORM update/delete evaluator in :ticket:`3366` such that if an unmapped column expression is present in the update or delete, if the evaluator can match its name to the mapped columns of the target class, a warning is emitted, rather than raising UnevaluatableError. This is essentially the pre-1.2 behavior, and is to allow migration for applications that are currently relying upon this pattern. However, if the given attribute name cannot be matched to the columns of the mapper, the UnevaluatableError is still raised, which is what was fixed in :ticket:`3366`. Change-Id: I658ed0dbf485b7f8009774f9c12d9912447abd2a Fixes: #4073
Diffstat (limited to 'lib/sqlalchemy/orm/evaluator.py')
-rw-r--r--lib/sqlalchemy/orm/evaluator.py16
1 files changed, 13 insertions, 3 deletions
diff --git a/lib/sqlalchemy/orm/evaluator.py b/lib/sqlalchemy/orm/evaluator.py
index aff6718d3..3f2a83a02 100644
--- a/lib/sqlalchemy/orm/evaluator.py
+++ b/lib/sqlalchemy/orm/evaluator.py
@@ -7,6 +7,8 @@
import operator
from ..sql import operators
+from .. import inspect
+from .. import util
class UnevaluatableError(Exception):
@@ -59,9 +61,17 @@ class EvaluatorCompiler(object):
)
key = parentmapper._columntoproperty[clause].key
else:
- raise UnevaluatableError(
- "Cannot evaluate column: %s" % clause
- )
+ key = clause.key
+ if self.target_cls and key in inspect(self.target_cls).column_attrs:
+ util.warn(
+ "Evaluating non-mapped column expression '%r' onto "
+ "ORM instances; this is a deprecated use case. Please "
+ "make use of the actual mapped columns in ORM-evaluated "
+ "UPDATE / DELETE expressions." % clause)
+ else:
+ raise UnevaluatableError(
+ "Cannot evaluate column: %s" % clause
+ )
get_corresponding_attr = operator.attrgetter(key)
return lambda obj: get_corresponding_attr(obj)