Подтвердить что ты не робот

Регистрировать все запросы sql

Как я могу регистрировать все SQL-запросы, выполняемые моим приложением django?

Я хочу регистрировать все, включая SQL файлы с сайта администратора. Я видел этот вопрос и ответ на часто задаваемый вопрос, но я до сих пор не могу понять, где я должен положить

from django.db import connection
connection.queries

записать все в один файл?

Итак, мой вопрос: что мне делать, чтобы иметь файл (скажем, all-sql.log), где записываются все SQL-инструкции?

4b9b3361

Ответ 1

Возможно, зайдите https://github.com/django-debug-toolbar/django-debug-toolbar

Это позволит вам увидеть все запросы, сгенерированные данной страницей. Также, как и стекы, где они встречаются и т.д.

EDIT: для регистрации всех SQL-запросов в файл и т.д., вы захотите создать некоторое промежуточное ПО. Middleware запускается по каждому запросу. Для этого есть несколько фрагментов Django:

Те, кто связан с печатью на терминале, не будут трудно адаптировать их для использования библиотеки протоколов python.

Ответ 2

Объедините следующий фрагмент с полем LOGGING в settings.py:

LOGGING = {
    'version': 1,
    'filters': {
        'require_debug_true': {
            '()': 'django.utils.log.RequireDebugTrue',
        }
    },
    'handlers': {
        'console': {
            'level': 'DEBUG',
            'filters': ['require_debug_true'],
            'class': 'logging.StreamHandler',
        }
    },
    'loggers': {
        'django.db.backends': {
            'level': 'DEBUG',
            'handlers': ['console'],
        }
    }
}

Извлечен из @acardenas89 ответ

Ответ 3

Добавьте следующие жирные выражения в settings.py


if DEBUG:
    import logging
    l = logging.getLogger('django.db.backends')
    l.setLevel(logging.DEBUG)
    l.addHandler(logging.StreamHandler())


LOGGING = {
    'version': 1,
    'disable_existing_loggers': False,
    'filters': {
        'require_debug_false': {
            '()': 'django.utils.log.RequireDebugFalse'
        }
    },
    'handlers': {
        'mail_admins': {
            'level': 'ERROR',
            'filters': ['require_debug_false'],
            'class': 'django.utils.log.AdminEmailHandler'
        },'console': {
            'level': 'DEBUG',
            'class': 'logging.StreamHandler',
        },
    },
    'loggers': {
        'django.request': {
            'handlers': ['mail_admins'],
            'level': 'ERROR',
            'propagate': True,
        },'django.db.backends.sqlite3': {
            'level': 'DEBUG',
            'handlers': ['console'],
        },
    }
}
  

Ресурс/Кредит

Ответ 5

Для записи SQL-запросов во время тестирования вам понадобятся две вещи:

  1. django.db.backends включен и
  2. @override_settings(DEBUG=True) декоратор.

Организатор теста по умолчанию установит DEBUG = False, игнорируя то, что вы, возможно, установили в DJANGO_SETTINGS_MODULE.

Минимальные настройки:

# https://docs.djangoproject.com/en/dev/ref/settings/#logging
LOGGING = {
    'version': 1,
    'handlers': {
        'console': {
            'class': 'logging.StreamHandler',
        },
    },
    'loggers': {
        'django.db.backends': {
            'level': 'DEBUG',
        },
    },
    'root': {
        'handlers': ['console'],
    }
}

Пример теста:

from django.contrib.auth.models import User
from django.test import TestCase, override_settings


class UserTests(TestCase):

    # To log queries in tests you need to manually override DEBUG setting
    # because testing sets DEBUG=False by default

    @override_settings(DEBUG=True)
    def test_create_user(self):
        User.objects.create()

Ответ 6

Вам нужно поместить это в пакет промежуточного программного обеспечения. Средство промежуточного уровня находится между ядром webserver/django и всеми вашими представлениями. Он может выполнять предварительную обработку перед запросом и постобработку после завершения запроса. Например, сохраните запросы в файл.