diff options
author | Mike Bayer <mike_mp@zzzcomputing.com> | 2022-11-14 08:54:56 -0500 |
---|---|---|
committer | Mike Bayer <mike_mp@zzzcomputing.com> | 2022-11-14 13:49:38 -0500 |
commit | 3ea8273c7926d19d4745bf5a859927838fa0783c (patch) | |
tree | fc8082f19320879be28877335c32f2d01b4254f7 /lib/sqlalchemy/sql/compiler.py | |
parent | 3d892381996e7ba68ee3bf6d7de40c8414e3812a (diff) | |
download | sqlalchemy-3ea8273c7926d19d4745bf5a859927838fa0783c.tar.gz |
add informative exception context for literal render
An informative re-raise is now thrown in the case where any "literal
bindparam" render operation fails, indicating the value itself and
the datatype in use, to assist in debugging when literal params
are being rendered in a statement.
Fixes: #8800
Change-Id: Id658f8b03359312353ddbb0c7563026239579f7b
(cherry picked from commit c7baf6e0aa624c9378c3bc3c4923d1e188d62dc9)
Diffstat (limited to 'lib/sqlalchemy/sql/compiler.py')
-rw-r--r-- | lib/sqlalchemy/sql/compiler.py | 29 |
1 files changed, 25 insertions, 4 deletions
diff --git a/lib/sqlalchemy/sql/compiler.py b/lib/sqlalchemy/sql/compiler.py index a7232f096..611cd1821 100644 --- a/lib/sqlalchemy/sql/compiler.py +++ b/lib/sqlalchemy/sql/compiler.py @@ -38,6 +38,7 @@ from . import operators from . import schema from . import selectable from . import sqltypes +from . import util as sql_util from .base import NO_ARG from .base import prefix_anon_map from .elements import quoted_name @@ -1216,7 +1217,8 @@ class SQLCompiler(Compiled): replacement_expressions[ escaped_name ] = self.render_literal_bindparam( - parameter, render_literal_value=value + parameter, + render_literal_value=value, ) continue @@ -2590,10 +2592,29 @@ class SQLCompiler(Compiled): processor = type_._cached_literal_processor(self.dialect) if processor: - return processor(value) + try: + return processor(value) + except Exception as e: + util.raise_( + exc.CompileError( + "Could not render literal value " + '"%s" ' + "with datatype " + "%s; see parent stack trace for " + "more detail." + % ( + sql_util._repr_single_value(value), + type_, + ) + ), + from_=e, + ) + else: - raise NotImplementedError( - "Don't know how to literal-quote value %r" % value + raise exc.CompileError( + "No literal value renderer is available for literal value " + '"%s" with datatype %s' + % (sql_util._repr_single_value(value), type_) ) def _truncate_bindparam(self, bindparam): |