Я хотел бы просмотреть запросы, выполняемые внутри блока кода, в идеале получить его в виде списка строк.
Конечно, есть подобных SO вопросов и ответов , но они не отвечают моим трем конкретным требованиям:
- Работает для запросов, отличных от
SELECT
.
- Работает, когда код не находится в режиме
DEBUG
.
- Код выполняется нормально, т. Е. Любой рабочий код выполняется как рабочий код.
У меня есть транзакция внутри переопределения DEBUG=True
, которая мгновенно откатывается после сбора запросов.
from contextlib import contextmanager
from django.conf import settings
from django.db import connections
from django.db import transaction
from django.test.utils import override_settings
@contextmanager
@override_settings(DEBUG=True)
def print_query():
class OhNo(Exception):
pass
queries = []
try:
with transaction.atomic():
yield
for connection in connections:
queries.extend(connections[connection].queries)
print(queries)
raise OhNo
except OhNo:
pass
def do_special_debug_thing():
print('haha yes')
with print_query():
Foo.objects.update(bar=1)
if settings.DEBUG:
do_special_debug_thing()
С этим фрагментом есть две проблемы:
- Это
DEBUG
переопределение ничего не делает. Диспетчер контекста выводит []
.
- Если действует переопределение
DEBUG
, то вызывается do_special_debug_thing
, чего я не хочу.
Итак, насколько я знаю, нет способа собрать все запросы, сделанные внутри блока кода, включая те, которые являются операторами SELECT
, пока DEBUG
выключен. Какие есть способы добиться этого?