gpt4 book ai didi

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

转载 作者:太空狗 更新时间:2023-10-29 21:48:20 26 4
gpt4 key购买 nike

我很难找到我在数据库日志中看到的查询的来源。我使用的是 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 应用程序中的什么地方生成这些查询?

最佳答案

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

您描述的代码正是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

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

关于python - 使用 Django 时查找查询源的推荐方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50422261/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com