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

时间:2018-05-19 05:55:42

标签: 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

我在想:

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

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

1 个答案:

答案 0 :(得分:5)

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

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

INSTALLED_APPS = (
    'sqlstacktrace',
)

SQL_STACKTRACE = True

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

另一个应该直接开箱即用的选项是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

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