我在查找我在数据库日志中看到的查询源时遇到了困难。我正在使用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 Debug Toolbar的人。我已经意识到这一点(以及像Django Silk这样的类似工具)并且已经在使用它,但是在这种特殊情况下我对反向问题更感兴趣。那就是:从我看到经常执行特定类型的查询的数据库开始,或者需要很长时间,我想知道在我的Django应用程序中我在哪里生成这些查询?
答案 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
我应该警告我自己还没有用过,但是下次我在自己的项目中遇到这样的问题时,它们将成为榜单的首选。