我想查看在代码块中运行的查询,最好将其作为字符串列表获取。
当然有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
语句。有什么方法可以实现这一目标?
答案 0 :(得分:0)
如果您只想执行一次,那么分别获取查询并将其放在列表中可以为您提供帮助。
update = Foo.objects.filter(bar=1)
query = str(update.query)
print(query)