Применение изменений django .db.backends ко всему проекту - PullRequest
0 голосов
/ 13 марта 2020

Так что мне нужно было создать собственный CursorWrappedDebug для регистрации запросов об ошибках (в файле django .db.backends.utils.py). Я сделал:

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})


utils.CursorDebugWrapper = CustomCursorDebugWrapper

Теперь мне нужно применить эти изменения ко всему проекту (все модули и т. Д. c.), А не к текущему файлу. Должен ли я сделать как пользовательский сервер базы данных, если так, то как реализовать пользовательский сервер базы данных.

РЕДАКТИРОВАНИЕ Нашли решение (см. Ссылку) 1008 *

1 Ответ

0 голосов
/ 16 марта 2020

Нашли решение (см. Ссылку) 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',
    }
}

...

Применимо к проекту

...