summaryrefslogtreecommitdiff
path: root/lib/sqlalchemy
diff options
context:
space:
mode:
authorMike Bayer <mike_mp@zzzcomputing.com>2019-08-21 17:29:55 -0400
committerMike Bayer <mike_mp@zzzcomputing.com>2019-08-22 14:01:05 -0400
commit4b321e8a5e6b728a818a801c3ad90bb759c584bc (patch)
tree07c1d5ba69d129383e783fbf621bf2eec0ab90fc /lib/sqlalchemy
parent94385b031c1dac004ee4181cb5783328d740d110 (diff)
downloadsqlalchemy-4b321e8a5e6b728a818a801c3ad90bb759c584bc.tar.gz
Add hide_parameters flag to create_engine
Added new parameter :paramref:`.create_engine.hide_parameters` which when set to True will cause SQL parameters to no longer be logged, nor rendered in the string representation of a :class:`.StatementError` object. Fixes: #4815 Change-Id: Ib87f868b6936cf6b42b192644e9d732ec24266c2
Diffstat (limited to 'lib/sqlalchemy')
-rw-r--r--lib/sqlalchemy/engine/base.py17
-rw-r--r--lib/sqlalchemy/engine/create.py6
-rw-r--r--lib/sqlalchemy/exc.py48
3 files changed, 62 insertions, 9 deletions
diff --git a/lib/sqlalchemy/engine/base.py b/lib/sqlalchemy/engine/base.py
index a708643b3..a0a2680ca 100644
--- a/lib/sqlalchemy/engine/base.py
+++ b/lib/sqlalchemy/engine/base.py
@@ -1222,9 +1222,14 @@ class Connection(Connectable):
if self._echo:
self.engine.logger.info(statement)
- self.engine.logger.info(
- "%r", sql_util._repr_params(parameters, batches=10)
- )
+ if not self.engine.hide_parameters:
+ self.engine.logger.info(
+ "%r", sql_util._repr_params(parameters, batches=10)
+ )
+ else:
+ self.engine.logger.info(
+ "[SQL parameters hidden due to hide_parameters=True]"
+ )
evt_handled = False
try:
@@ -1388,6 +1393,7 @@ class Connection(Connectable):
parameters,
e,
self.dialect.dbapi.Error,
+ hide_parameters=self.engine.hide_parameters,
dialect=self.dialect,
),
exc_info,
@@ -1408,6 +1414,7 @@ class Connection(Connectable):
parameters,
e,
self.dialect.dbapi.Error,
+ hide_parameters=self.engine.hide_parameters,
connection_invalidated=self._is_disconnect,
dialect=self.dialect,
)
@@ -1508,6 +1515,7 @@ class Connection(Connectable):
None,
e,
dialect.dbapi.Error,
+ hide_parameters=engine.hide_parameters,
connection_invalidated=is_disconnect,
)
else:
@@ -1904,6 +1912,7 @@ class Engine(Connectable, log.Identified):
echo=None,
proxy=None,
execution_options=None,
+ hide_parameters=False,
):
self.pool = pool
self.url = url
@@ -1911,6 +1920,7 @@ class Engine(Connectable, log.Identified):
if logging_name:
self.logging_name = logging_name
self.echo = echo
+ self.hide_parameters = hide_parameters
log.instance_logger(self, echoflag=echo)
if proxy:
interfaces.ConnectionProxy._adapt_listener(self, proxy)
@@ -2339,6 +2349,7 @@ class OptionEngine(Engine):
self.dialect = proxied.dialect
self.logging_name = proxied.logging_name
self.echo = proxied.echo
+ self.hide_parameters = proxied.hide_parameters
log.instance_logger(self, echoflag=self.echo)
# note: this will propagate events that are assigned to the parent
diff --git a/lib/sqlalchemy/engine/create.py b/lib/sqlalchemy/engine/create.py
index 72be6009b..43378f24e 100644
--- a/lib/sqlalchemy/engine/create.py
+++ b/lib/sqlalchemy/engine/create.py
@@ -197,6 +197,12 @@ def create_engine(url, **kwargs):
be applied to all connections. See
:meth:`~sqlalchemy.engine.Connection.execution_options`
+ :param hide_parameters: Boolean, when set to True, SQL statement parameters
+ will not be displayed in INFO logging nor will they be formatted into
+ the string representation of :class:`.StatementError` objects.
+
+ .. versionadded:: 1.3.8
+
:param implicit_returning=True: When ``True``, a RETURNING-
compatible construct, if available, will be used to
fetch newly generated primary key values when a single row
diff --git a/lib/sqlalchemy/exc.py b/lib/sqlalchemy/exc.py
index 1e575626a..efee58d99 100644
--- a/lib/sqlalchemy/exc.py
+++ b/lib/sqlalchemy/exc.py
@@ -332,11 +332,20 @@ class StatementError(SQLAlchemyError):
orig = None
"""The DBAPI exception object."""
- def __init__(self, message, statement, params, orig, code=None):
+ def __init__(
+ self,
+ message,
+ statement,
+ params,
+ orig,
+ hide_parameters=False,
+ code=None,
+ ):
SQLAlchemyError.__init__(self, message, code=code)
self.statement = statement
self.params = params
self.orig = orig
+ self.hide_parameters = hide_parameters
self.detail = []
def add_detail(self, msg):
@@ -345,7 +354,13 @@ class StatementError(SQLAlchemyError):
def __reduce__(self):
return (
self.__class__,
- (self.args[0], self.statement, self.params, self.orig),
+ (
+ self.args[0],
+ self.statement,
+ self.params,
+ self.orig,
+ self.hide_parameters,
+ ),
)
def _sql_message(self, as_unicode):
@@ -361,8 +376,13 @@ class StatementError(SQLAlchemyError):
stmt_detail = "[SQL: %s]" % self.statement
details.append(stmt_detail)
if self.params:
- params_repr = util._repr_params(self.params, 10)
- details.append("[parameters: %r]" % params_repr)
+ if self.hide_parameters:
+ details.append(
+ "[SQL parameters hidden due to hide_parameters=True]"
+ )
+ else:
+ params_repr = util._repr_params(self.params, 10)
+ details.append("[parameters: %r]" % params_repr)
code_str = self._code_str()
if code_str:
details.append(code_str)
@@ -401,6 +421,7 @@ class DBAPIError(StatementError):
params,
orig,
dbapi_base_err,
+ hide_parameters=False,
connection_invalidated=False,
dialect=None,
):
@@ -425,6 +446,7 @@ class DBAPIError(StatementError):
statement,
params,
orig,
+ hide_parameters=hide_parameters,
code=orig.code,
)
elif not isinstance(orig, dbapi_base_err) and statement:
@@ -438,6 +460,7 @@ class DBAPIError(StatementError):
statement,
params,
orig,
+ hide_parameters=hide_parameters,
)
glob = globals()
@@ -452,7 +475,12 @@ class DBAPIError(StatementError):
break
return cls(
- statement, params, orig, connection_invalidated, code=cls.code
+ statement,
+ params,
+ orig,
+ connection_invalidated=connection_invalidated,
+ hide_parameters=hide_parameters,
+ code=cls.code,
)
def __reduce__(self):
@@ -462,12 +490,19 @@ class DBAPIError(StatementError):
self.statement,
self.params,
self.orig,
+ self.hide_parameters,
self.connection_invalidated,
),
)
def __init__(
- self, statement, params, orig, connection_invalidated=False, code=None
+ self,
+ statement,
+ params,
+ orig,
+ hide_parameters=False,
+ connection_invalidated=False,
+ code=None,
):
try:
text = str(orig)
@@ -480,6 +515,7 @@ class DBAPIError(StatementError):
statement,
params,
orig,
+ hide_parameters,
code=code,
)
self.connection_invalidated = connection_invalidated