Django 获取查询执行时间
Django get query execution time
有没有一种方法可以不使用 django-debug-toolbar 来测量 Django 查询时间?它不适用于debugging/logging,我需要它像about # results (# seconds)
一样显示在网页上。
编辑:我在生产模式下需要这个功能,所以 DEBUG=True
不是一个选项
您可以在 django.db.connection.queries
中找到信息。
你可以这样做:
如果 DEBUG=True
在 settings.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'])
有没有一种方法可以不使用 django-debug-toolbar 来测量 Django 查询时间?它不适用于debugging/logging,我需要它像about # results (# seconds)
一样显示在网页上。
编辑:我在生产模式下需要这个功能,所以 DEBUG=True
不是一个选项
您可以在 django.db.connection.queries
中找到信息。
你可以这样做:
如果 DEBUG=True
在 settings.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'])