【发布时间】: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