Django 获取查询执行时间

Django get query execution time

有没有一种方法可以不使用 django-debug-toolbar 来测量 Django 查询时间?它不适用于debugging/logging,我需要它像about # results (# seconds)一样显示在网页上。

编辑:我在生产模式下需要这个功能,所以 DEBUG=True 不是一个选项

您可以在 django.db.connection.queries 中找到信息。

你可以这样做:

如果 DEBUG=Truesettings.py 中,您可以使用以下方式查看您的数据库查询(和时间):

>>> from django.db import connection
>>> connection.queries  

P.s:有一个名为 django-debug-toolbar 的软件包可以帮助您查看您的查询和计时等...。我建议使用它而不是 connection.queries.

虽然 django.db.connection.queries 会给你查询时间,但它只在 DEBUG=True 时有效。为了将它用于一般用途,我们可以使用 Database instrumentation [Django docs] 并编写一个包装器来为我们的查询计时。以下是直接来自上述文档的示例,我认为它似乎符合您的需要:

import time

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.monotonic()
        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.monotonic() - start
            current_query['duration'] = duration
            self.queries.append(current_query)

要使用它,您将以这种方式进行查询:

from django.db import connection

query_logger = QueryLogger()

with connection.execute_wrapper(query_logger):
    # Make your queries here

for query in query_logger.queries:
    print(query['sql'], query['duration'])