Нашли решение (см. Ссылку) https://docs.djangoproject.com/en/3.0/ref/databases/#subclassing -the-встроенный в базу данных backends
Мой пользовательский каталог базы данных:
mydbengine/
__init__.py
base.py
Файл base.py:
from django.db.backends.postgresql_psycopg2 import base
from django.db.backends.utils import CursorWrapper
from django.db.utils import Error
from time import time
import logging
logger = logging.getLogger('django.db.backends')
class CustomCursorDebugWrapper(CursorWrapper):
def execute(self, sql, params=None):
start = time()
try:
return super(CustomCursorDebugWrapper, self).execute(sql, params)
except Error as e:
exception=e
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,
})
if 'exception' in locals():
logger.error('(%.3f) %s; args=%s' % (duration, sql, params),extra={'duration': duration, 'sql': sql, 'params': params})
raise exception
else:
logger.debug('(%.3f) %s; args=%s' % (duration, sql, params),extra={'duration': duration, 'sql': sql, 'params': params})
def executemany(self, sql, param_list):
start = time()
try:
return super(CustomCursorDebugWrapper, self).executemany(sql, param_list)
except Error as e:
exception=e
finally:
stop = time()
duration = stop - start
try:
times = len(param_list)
except TypeError: # param_list could be an iterator
times = '?'
self.db.queries_log.append({
'sql': '%s times: %s' % (times, sql),
'time': "%.3f" % duration,
})
if 'exception' in locals():
logger.error('(%.3f) %s; args=%s' % (duration, sql, param_list),extra={'duration': duration, 'sql': sql, 'params': param_list})
raise exception
else:
logger.debug('(%.3f) %s; args=%s' % (duration, sql, param_list),extra={'duration': duration, 'sql': sql, 'params': param_list})
class DatabaseWrapper(base.DatabaseWrapper):
def make_debug_cursor(self, cursor):
"""
Creates a cursor that logs all queries in self.queries_log.
"""
return CustomCursorDebugWrapper(cursor, self)
Теперь я переопределил класс CursorDebugWrapper для регистрации запросов на уровне ошибки. (Только postgresql)
Файл settings.py:
...
DATABASES = {
'default': {
'ENGINE': 'database',
'NAME': 'name',
'USER': 'user',
'PASSWORD': 'password',
'HOST': '127.0.0.1',
'PORT': '5432',
}
}
...
Применимо к проекту