关于查询的Django追溯

时间:2014-07-21 23:09:22

标签: sql django performance django-models backtrace

我希望在请求期间执行的每个查询都有回溯,因此我可以找到他们来自哪里并减少计数/复杂性。

我使用this优秀的中间件片段来列出和查询时间,但我不知道他们来自哪里。

我已经在django/db/models/sql/compiler.py中进行了搜索,但明显的形式是获取django的本地版本并编辑该代码我无法查看如何锁定查询。有没有可以使用的信号?好像有isn't a signal on every query

是否可以指定默认的Manager

(我知道django-toolbar,我希望有一个没有使用它的解决方案。)

2 个答案:

答案 0 :(得分:6)

一个丑陋但有效的解决方案(例如,它在所有查询上打印跟踪,只需要一次编辑)就是将以下内容添加到settings.py的底部:

import django.db.backends.utils as bakutils
import traceback

bakutils.CursorDebugWrapper_orig = bakutils.CursorWrapper

def print_stack_in_project():
    stack = traceback.extract_stack()
    for path, lineno, func, line in stack:
        if 'lib/python' in path or 'settings.py' in path:
            continue
        print 'File "%s", line %d, in %s' % (path, lineno, func)
        print '  %s' % line

class CursorDebugWrapperLoud(bakutils.CursorDebugWrapper_orig):
    def execute(self, sql, params=None):
        try:
            return super(CursorDebugWrapperLoud, self).execute(sql, params)
        finally:
            print_stack_in_project()
            print sql
            print '\n\n\n'

    def executemany(self, sql, param_list):
        try:
            return super(CursorDebugWrapperLoud, self).executemany(sql, param_list)
        finally:
            print_stack_in_project()
            print sql
            print '\n\n\n'

bakutils.CursorDebugWrapper = CursorDebugWrapperLoud

仍然不确定是否有更优雅的方式来做这件事?

答案 1 :(得分:1)

Django调试工具栏会告诉你你想要什么,壮观的真棒。