Получить запрос на обновление, когда DEBUG имеет значение False, не влияя на выполнение кода - PullRequest
0 голосов
/ 12 июня 2019

Я хотел бы просмотреть запросы, выполняемые внутри блока кода, в идеале получить его в виде списка строк.

Конечно, есть подобных 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 выключен. Какие есть способы добиться этого?

1 Ответ

0 голосов
/ 12 июня 2019

Если вы хотите сделать это только один раз, вам могут помочь раздельные запросы и поместить их в список.

update = Foo.objects.filter(bar=1)
query = str(update.query)
print(query)
...