使用Django时查找查询源的推荐方法?

Gre*_*her 7 python sql django

我在查找我在数据库日志中看到的查询源时遇到了困难.我正在使用Django,因此实际的查询会自动生成,这使得简单的"grep"无效.

我正在考虑修补数据库游标以将当前堆栈跟踪追加到查询中,例如:

for conn in connections.all():
    with conn.cursor() as c:
        ctype = type(c.cursor)
        orig_execute = ctype.execute
        def _patchedExecute(self, query, params=None):
            query = query + ' -- ' + traceback.format_stack()
            return orig_execute(self, query, params)
        ctype.execute = _patchedExecute
        orig_execute_many = ctype.executemany
        def _patchedExecuteMany(self, query, params=None):
            query = query + ' -- ' + traceback.format_stack()
            return orig_execute_many(self, query, params)
        ctype.executemany = _patchedExecuteMany
Run Code Online (Sandbox Code Playgroud)

我想知道的是:

  • 有没有现成的解决方案?(似乎有点常见的问题)
  • 如果没有,是否有比上述解决方案更好的解决方案?(我不熟悉Django内部)

编辑:感谢所有建议使用Django Debug Toolbar的人.我已经意识到这一点(以及像Django Silk这样的类似工具)并且已经在使用它,但是在这种特殊情况下我对反向问题更感兴趣.那就是:从我看到经常执行特定类型的查询的数据库开始,或者需要很长时间,我想知道我的Django应用程序在哪里生成这些查询?

Pet*_*ain 5

编辑:添加了另一个选项......

您描述的代码正是https://pypi.org/project/django-sql-stacktrace/应该为您做的.只需点击安装它并将其添加到您的应用程序.设置很简单,但为了完整性:

INSTALLED_APPS = (
    'sqlstacktrace',
)

SQL_STACKTRACE = True
Run Code Online (Sandbox Code Playgroud)

而已!但是,该项目看起来有点不受欢迎,因此您可能需要一个更受欢迎且最近维护的项目......

另一个应该直接开箱即用的选项是https://github.com/dobarkod/django-queryinspect.这不允许您直接从SQL服务器日志,但应该在您的Web服务器日志中提供必要的信息.

这里需要相当多的配置,但我试图总结下面的系统来记录重复请求和超过100毫秒的请求:

MIDDLEWARE_CLASSES += (
    'qinspect.middleware.QueryInspectMiddleware',
)
DEBUG = True
LOGGING = {
    ...
    'handlers': {
        ...
        'console': {
            'level': 'DEBUG',
            'class': 'logging.StreamHandler',
        },
        ...
    },

    'loggers': {
        ...
        'qinspect': {
            'handlers': ['console'],
            'level': 'DEBUG',
            'propagate': True,
        },
    },
    ...
}
QUERY_INSPECT_ENABLED = True
QUERY_INSPECT_LOG_QUERIES = True
QUERY_INSPECT_LOG_TRACEBACKS = True
QUERY_INSPECT_ABSOLUTE_LIMIT = 100 # in milliseconds
Run Code Online (Sandbox Code Playgroud)

我应该警告我自己还没有用过,但是下次我在自己的项目中遇到这样的问题时,它们将成为榜单的首选.