реєструвати всі запити sql


98

Як я можу реєструвати всі запити SQL, які виконувала моя програма django?

Я хочу реєструвати все, включаючи SQL-файли з сайту адміністратора. Я побачив це запитання та відповідь на поширені запитання, але досі не можу зрозуміти, куди мені подіти

from django.db import connection
connection.queries

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

Отже, моє запитання - що мені робити, щоб у мене був файл (скажімо, all-sql.log), де всі оператори SQL реєструються?


Відповіді:


19

Можливо, перевірте https://github.com/django-debug-toolbar/django-debug-toolbar

Це дозволить побачити всі запити, згенеровані даною сторінкою. А також стеки місця їх виникнення тощо.

РЕДАКТУВАТИ: щоб записати всі запити SQL у файл тощо, тоді вам потрібно буде створити проміжне програмне забезпечення. Проміжне програмне забезпечення запускається при кожному запиті. Для цього є кілька фрагментів Django:

Тих, хто займається друком на терміналі, але не складно буде адаптувати їх для використання бібліотеки журналів python.


177

Об’єднайте такий фрагмент із 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
можливо, вам доведеться додати наступне до handlersрозділу, якщо ви не зможете додати обробник 'console': помилка 'console' : 'console':{ 'level':'DEBUG', 'class':'logging.StreamHandler', 'formatter': 'verbose', 'stream': sys.stderr, },
Дон Грем

1
Мені також було потрібно 'version': 1,в LOGGINGдикті.
Ден,

12
Зверніть увагу, що DEBUG має бути TRUE, щоб журнали могли бути фактично зареєстровані. Незалежно від параметрів реєстрації.
Януш Сконецький,

3
Так, і ще одна річ , в Джанго тест бігун ігнорує налаштування і перевизначення DEBUGдля False, тому в тесті ви повинні@override_settings(DEBUG=True)
Януш Skonieczny

7
Я також додав би 'propagate': Falseпісля 'handlers': ['console'],рядка, якщо у вас увімкнено кореневий реєстратор і ви не знаєте, чому це друкується двічі. Мені потрібно було трохи усвідомити.
Андрій-Нікулае Петре,

44

Додайте наступні жирні твердження в settings.py


якщо ДЕБУГ:
    імпорт журналювання
    l = logging.getLogger ('django.db.backends')
    l.setLevel (logging.DEBUG)
    l.addHandler (logging.StreamHandler ())


ВХІД = {
    'версія': 1,
    'disable_existing_loggers': False,
    'фільтри': {
        'require_debug_false': {
            '()': 'django.utils.log.RequireDebugFalse'
        }
    },
    'обробники': {
        'mail_admins': {
            'level': 'ПОМИЛКА',
            'фільтри': ['require_debug_false'],
            'клас': 'django.utils.log.AdminEmailHandler'
        }, 'console': {
            'level': 'DEBUG',
            'class': 'logging.StreamHandler',
        } ,
    },
    'реєстратори': {
        'django.request': {
            'обробники': ['адміністратори_пошти'],
            'level': 'ПОМИЛКА',
            'propagate': правда,
        }, 'django.db.backends.sqlite3': {
            'level': 'DEBUG',
            'обробники': ['консоль'],
        } ,
    }
}
  

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


9
Вам не потрібні як ifтвердження вгорі, так і LOGGINGзміни. ifЗаява, якщо ви хочете додати протоколювання в той час як , наприклад , в оболонці, щоб включити його відразу - все , що вам потрібно в settings.py це LOGGINGзміна - і Ви могли б також хотіти django.db.backends, чи не sqlite3 специфічний.
M Somerville

Я не бачу запитів на консолі, на якій запущено django 1.9. DEBUG = True.
Ciro Santilli 郝海东 冠状 病 六四 事件 法轮功

1
@CiroSantilli 巴拿馬 文件 六四 事件 法轮功 Це справді старий коментар, дуже можливо, Django 1.9 не підтримує це рішення так само.
cevaris

У Django 1.9 DEBUGналаштування змушене бути False під час запуску тестів. Обхідним шляхом є повторне включення його в тесті
Mouscellaneous


7

Щоб реєструвати запити 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()

2

Вам потрібно лише:

@override_settings(DEBUG=True)

якщо у вас вже надруковані оператори налагодження SQL runserver.

Додайте декоратор до вашого class TestA(TestCase)або test_function:

@override_settings(DEBUG=True)
class TestA(TestCase):
...

    @override_settings(DEBUG=True)
    def test_function(self):
    ...

Кредити на відповідь @Janusz Skonieczny!


0

Вам потрібно помістити це в пакет проміжного програмного забезпечення. Проміжне програмне забезпечення знаходиться між ядром веб-сервера / django та всіма вашими поглядами. Він може виконувати попередню обробку перед запитом та подальшу обробку після завершення запиту. Наприклад, збережіть запити у файл.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.