【问题标题】:Recommended way to find the source of a query when using Django?使用 Django 时查找查询源的推荐方法?
【发布时间】:2018-10-29 12:58:59
【问题描述】:

我在查找我在数据库日志中看到的查询的来源时遇到了困难。我使用的是 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 调试工具栏的人。我已经意识到这一点(以及类似的工具,如 Django Silk)并且已经在使用它,但是在这种特殊情况下,我对相反的问题更感兴趣。即:从我看到频繁执行特定类型的查询或需要很长时间的数据库开始,我想知道 我在 Django 应用程序中的哪个位置生成这些查询?

【问题讨论】:

  • 你需要 Django 调试工具栏。
  • 您只想查看服务器日志上的堆栈跟踪,还是可以在客户端查看查询日志和堆栈跟踪?

标签: python sql django


【解决方案1】:

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

您描述的代码正是https://pypi.org/project/django-sql-stacktrace/ 应该为您做的。只需 pip 安装它并将其添加到您的应用程序中。这些设置是微不足道的,但为了完整性:

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

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

【讨论】:

    猜你喜欢
    • 2021-10-19
    • 1970-01-01
    • 2014-10-09
    • 2011-05-23
    • 2016-07-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-10-05
    相关资源
    最近更新 更多