diff options
| author | Mike Bayer <mike_mp@zzzcomputing.com> | 2019-08-21 17:29:55 -0400 |
|---|---|---|
| committer | Mike Bayer <mike_mp@zzzcomputing.com> | 2019-08-22 14:01:05 -0400 |
| commit | 4b321e8a5e6b728a818a801c3ad90bb759c584bc (patch) | |
| tree | 07c1d5ba69d129383e783fbf621bf2eec0ab90fc /lib/sqlalchemy | |
| parent | 94385b031c1dac004ee4181cb5783328d740d110 (diff) | |
| download | sqlalchemy-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.py | 17 | ||||
| -rw-r--r-- | lib/sqlalchemy/engine/create.py | 6 | ||||
| -rw-r--r-- | lib/sqlalchemy/exc.py | 48 |
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 |
