Kaydet (Commit) 1cb65b8a authored tarafından Markus Holtermann's avatar Markus Holtermann

Fixed #26157 #25321 -- Added sql/params to extra context of schema logger

Thanks Akshesh Doshi for the initial patch and Tim Graham for the review
üst d0fe6c91
...@@ -99,7 +99,7 @@ class BaseDatabaseSchemaEditor(object): ...@@ -99,7 +99,7 @@ class BaseDatabaseSchemaEditor(object):
Executes the given SQL statement, with optional parameters. Executes the given SQL statement, with optional parameters.
""" """
# Log the command we're running, then run it # Log the command we're running, then run it
logger.debug("%s; (params %r)", sql, params) logger.debug("%s; (params %r)", sql, params, extra={'params': params, 'sql': sql})
if self.collect_sql: if self.collect_sql:
ending = "" if sql.endswith(";") else ";" ending = "" if sql.endswith(";") else ";"
if params is not None: if params is not None:
......
...@@ -502,7 +502,7 @@ class ignore_warnings(TestContextDecorator): ...@@ -502,7 +502,7 @@ class ignore_warnings(TestContextDecorator):
@contextmanager @contextmanager
def patch_logger(logger_name, log_level): def patch_logger(logger_name, log_level, log_kwargs=False):
""" """
Context manager that takes a named logger and the logging level Context manager that takes a named logger and the logging level
and provides a simple mock-like list of messages received and provides a simple mock-like list of messages received
...@@ -510,7 +510,8 @@ def patch_logger(logger_name, log_level): ...@@ -510,7 +510,8 @@ def patch_logger(logger_name, log_level):
calls = [] calls = []
def replacement(msg, *args, **kwargs): def replacement(msg, *args, **kwargs):
calls.append(msg % args) call = msg % args
calls.append((call, kwargs) if log_kwargs else call)
logger = logging.getLogger(logger_name) logger = logging.getLogger(logger_name)
orig = getattr(logger, log_level) orig = getattr(logger, log_level)
setattr(logger, log_level, replacement) setattr(logger, log_level, replacement)
......
...@@ -583,6 +583,13 @@ specific logger following this example: ...@@ -583,6 +583,13 @@ specific logger following this example:
Logs the SQL queries that are executed during schema changes to the database by Logs the SQL queries that are executed during schema changes to the database by
the :doc:`migrations framework </topics/migrations>`. Note that it won't log the the :doc:`migrations framework </topics/migrations>`. Note that it won't log the
queries executed by :class:`~django.db.migrations.operations.RunPython`. queries executed by :class:`~django.db.migrations.operations.RunPython`.
Messages to this logger have ``params`` and ``sql`` in their extra context (but
unlike ``django.db.backends``, not duration). The values have the same meaning
as explained in :ref:`django-db-logger`.
.. versionadded:: 1.10
The ``extra`` context was added.
Handlers Handlers
-------- --------
......
...@@ -9,6 +9,7 @@ from admin_scripts.tests import AdminScriptTestCase ...@@ -9,6 +9,7 @@ from admin_scripts.tests import AdminScriptTestCase
from django.conf import settings from django.conf import settings
from django.core import mail from django.core import mail
from django.core.files.temp import NamedTemporaryFile from django.core.files.temp import NamedTemporaryFile
from django.db import connection
from django.test import RequestFactory, SimpleTestCase, override_settings from django.test import RequestFactory, SimpleTestCase, override_settings
from django.test.utils import LoggingCaptureMixin, patch_logger from django.test.utils import LoggingCaptureMixin, patch_logger
from django.utils.deprecation import RemovedInNextVersionWarning from django.utils.deprecation import RemovedInNextVersionWarning
...@@ -475,3 +476,23 @@ format=%(message)s ...@@ -475,3 +476,23 @@ format=%(message)s
out, err = self.run_manage(['check']) out, err = self.run_manage(['check'])
self.assertNoOutput(err) self.assertNoOutput(err)
self.assertOutput(out, "System check identified no issues (0 silenced).") self.assertOutput(out, "System check identified no issues (0 silenced).")
class SchemaLoggerTests(SimpleTestCase):
def test_extra_args(self):
editor = connection.schema_editor(collect_sql=True)
sql = "SELECT * FROM foo WHERE id in (%s, %s)"
params = [42, 1337]
with patch_logger('django.db.backends.schema', 'debug', log_kwargs=True) as logger:
editor.execute(sql, params)
self.assertEqual(
logger,
[(
'SELECT * FROM foo WHERE id in (%s, %s); (params [42, 1337])',
{'extra': {
'sql': 'SELECT * FROM foo WHERE id in (%s, %s)',
'params': [42, 1337],
}},
)]
)
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment