【问题标题】:Get update query when DEBUG is False, without affecting code executionDEBUG为False时获取更新查询,不影响代码执行
【发布时间】:2019-10-27 04:17:10
【问题描述】:

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

当然有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()

那个sn-p有两个问题:

  • DEBUG 覆盖没有任何作用。上下文管理器打印出[]
  • 如果DEBUG 覆盖有效,则调用do_special_debug_thing,我不希望发生这种情况。

因此,据我所知,没有办法收集在代码块中进行的所有查询,包括那些 SELECT 语句,而 DEBUG 已关闭。有什么方法可以做到这一点?

【问题讨论】:

  • 查看此答案以在未启用调试时收集所有查询stackoverflow.com/a/30394237/6682340
  • @Krukas 并没有真正将查询作为字符串列表返回,但总比什么都没有好,会试一试,谢谢。

标签: django django-orm


【解决方案1】:

如果您只想这样做一次,单独获取查询并将它们放在一个列表中可能会对您有所帮助。

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

【讨论】:

  • 嗯,.update() 的返回是更新行数的整数值,.delete() 的返回是一个字典。这不是一个可行的选择。 (编辑:这完全是一个不正确的答案,但我会跳过投票,因为你试图提供帮助。)
  • @Brian 你是对的。我在谈论记录查询集。我刚刚复制并粘贴了您的代码,忘记更改为filter()。我会解决的。
  • 如果您这样做,您的答案将不再满足问题的“适用于SELECT 以外的查询”部分。
猜你喜欢
  • 1970-01-01
  • 2013-02-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-06-11
  • 1970-01-01
  • 2010-11-08
  • 2021-02-07
相关资源
最近更新 更多