当DEBUG为False时获取更新查询,而不影响代码执行

时间:2019-06-12 15:31:54

标签: django django-orm

我想查看在代码块中运行的查询,最好将其作为字符串列表获取。

当然有similar SO questions and answers,但它们不能满足我的三个具体要求:

  • 适用于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 :(得分:0)

如果您只想执行一次,那么分别获取查询并将其放在列表中可以为您提供帮助。

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