【问题标题】:Number of queries executed over psycopg2 connection通过 psycopg2 连接执行的查询数
【发布时间】:2018-12-02 00:18:34
【问题描述】:

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

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

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

我正在运行一个 django 应用程序。如果 DEBUG 为 True,那么我有 connection.queries。但我想从生产服务器获取这个值

更新

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

【问题讨论】:

  • 你试过Django Debug Toolbar吗?它显示了执行的查询数。
  • @Chiefir 我想获取生产机器上每个 http 请求的编号。 django 调试工具栏注册一个信号处理程序来完成它的工作。我想避免这种开销,因为我担心 django 调试工具栏会降低性能。

标签: django postgresql psycopg2


【解决方案1】:

看看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

【讨论】:

    【解决方案2】:

    如果您的数据库和其他所有环境具有相同的环境,那么在生产和开发上进行的查询数量是相同的。

    我建议您使用Django Debug Toolbar,如前所述,复制查看您的视图正在执行多少次查询并根据此重新考虑您的代码,如果您想了解这些查询的性能,我建议您使用explain来自 postgresql 的命令。

    我通常复制查询并将其粘贴到我的 postgreaql 数据库 shell 中。看到这个:http://recordit.co/rGZ2SAo7PX

    【讨论】:

    • 你是对的,如果我对 dev 中的相同数据集执行完全相同的请求,那么查询量将是相等的。但我想要来自 prod 环境的统计数据。我无法在开发环境中重现一个月的产品流量。我更新了问题以使这一点更清楚。
    • 在这种情况下,您可以使用一些工具,更容易安装和使用它的newrelic.com 根据您的流量和环境,它可能很昂贵,但在我看来这是完全值得的观点。
    猜你喜欢
    • 1970-01-01
    • 2019-07-31
    • 1970-01-01
    • 1970-01-01
    • 2016-08-06
    • 2018-09-23
    • 2016-10-15
    • 2021-09-05
    • 2019-11-11
    相关资源
    最近更新 更多