Refs #30148 -- Moved logging queries in CursorDebugWrapper to debug_sql() contextmanager.

This commit is contained in:
kingbuzzman 2019-04-25 16:07:28 +00:00 committed by Mariusz Felisiak
parent 6754bffa2b
commit f7408b49a5
1 changed files with 20 additions and 21 deletions

View File

@ -3,6 +3,7 @@ import decimal
import functools import functools
import hashlib import hashlib
import logging import logging
from contextlib import contextmanager
from time import time from time import time
from django.conf import settings from django.conf import settings
@ -94,40 +95,38 @@ class CursorDebugWrapper(CursorWrapper):
# XXX callproc isn't instrumented at this time. # XXX callproc isn't instrumented at this time.
def execute(self, sql, params=None): def execute(self, sql, params=None):
start = time() with self.debug_sql(sql, params, use_last_executed_query=True):
try:
return super().execute(sql, params) return super().execute(sql, params)
finally:
stop = time()
duration = stop - start
sql = self.db.ops.last_executed_query(self.cursor, sql, params)
self.db.queries_log.append({
'sql': sql,
'time': "%.3f" % duration,
})
logger.debug(
'(%.3f) %s; args=%s', duration, sql, params,
extra={'duration': duration, 'sql': sql, 'params': params}
)
def executemany(self, sql, param_list): def executemany(self, sql, param_list):
with self.debug_sql(sql, param_list, many=True):
return super().executemany(sql, param_list)
@contextmanager
def debug_sql(self, sql=None, params=None, use_last_executed_query=False, many=False):
start = time() start = time()
try: try:
return super().executemany(sql, param_list) yield
finally: finally:
stop = time() stop = time()
duration = stop - start duration = stop - start
if use_last_executed_query:
sql = self.db.ops.last_executed_query(self.cursor, sql, params)
try: try:
times = len(param_list) times = len(params) if many else ''
except TypeError: # param_list could be an iterator except TypeError:
# params could be an iterator.
times = '?' times = '?'
self.db.queries_log.append({ self.db.queries_log.append({
'sql': '%s times: %s' % (times, sql), 'sql': '%s times: %s' % (times, sql) if many else sql,
'time': "%.3f" % duration, 'time': '%.3f' % duration,
}) })
logger.debug( logger.debug(
'(%.3f) %s; args=%s', duration, sql, param_list, '(%.3f) %s; args=%s',
extra={'duration': duration, 'sql': sql, 'params': param_list} duration,
sql,
params,
extra={'duration': duration, 'sql': sql, 'params': params},
) )