【发布时间】: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 调试工具栏。
-
您只想查看服务器日志上的堆栈跟踪,还是可以在客户端查看查询日志和堆栈跟踪?