通过psycopg2连接执行的查询数

时间:2018-06-22 13:41:23

标签: django postgresql psycopg2

我想知道在psycopg2连接上执行的sql查询的数量。

有没有办法获得这个号码?

如果HTTP请求产生的语句过多,我想发出警告。

我正在运行Django应用程序。如果DEBUG为True,则我有connection.queries。但是我想从生产服务器上获得这个价值

更新

我想要产品环境中的数字(统计数据)。这个问题与调试特定的http请求无关。

2 个答案:

答案 0 :(得分:3)

看看django-silk。它是一个分析工具,可记录诸如响应时间和查询数量之类的指标。

如果要推出自己的解决方案,并且正在使用Django 2.0,则可以使用connection wrapper创建中间件。该文档甚至展示了QueryLogger类:

import time
from django.db import connection


class QueryLogger:
    def __init__(self):
        self.queries = []

    def __call__(self, execute, sql, params, many, context):
        current_query = {'sql': sql, 'params': params, 'many': many}
        start = time.time()
        try:
            result = execute(sql, params, many, context)
        except Exception as e:
            current_query['status'] = 'error'
            current_query['exception'] = e
            raise
        else:
            current_query['status'] = 'ok'
            return result
        finally:
            duration = time.time() - start
            current_query['duration'] = duration
            self.queries.append(current_query)


class QueryLogginMiddleware:
    def __init__(self, get_response):
        self.get_response = get_response

    def __call__(self, request):
        ql = QueryLogger()
        with connection.execute_wrapper(ql):
            response = self.get_response(request)

        # do something with ql.queries here

        return response

答案 1 :(得分:0)

如果数据库和其他所有内容的环境都相同,那么在Production和Development上进行的查询数量是相同的。

我建议您如上所述使用Django Debug Toolbar,复制查看您的View正在执行的查询数量,然后根据该代码重新考虑您的代码,如果您想查看这些查询的性能,我建议您使用{来自Postgresql的{1}}命令。

通常,我复制查询并将其粘贴并在我的postgreaql数据库外壳中添加解释。看到这个:http://recordit.co/rGZ2SAo7PX