我正在开发一个基于django和postgresql的项目,需要查看每次django在数据库上运行的查询语句(以便我可以优化查询)。有没有一种方法可以获取这些查询语句。 更新:我的开发环境是ubuntu linux。
我正在开发一个基于django和postgresql的项目,需要查看每次django在数据库上运行的查询语句(以便我可以优化查询)。有没有一种方法可以获取这些查询语句。 更新:我的开发环境是ubuntu linux。
from functools import wraps
from django.utils import termcolors
format_ok = termcolors.make_style(opts=('bold',), fg='green')
format_warning = termcolors.make_style(opts=('bold',), fg='yellow')
format_error = termcolors.make_style(opts=('bold',), fg='red')
try:
from pygments import highlight
from pygments.lexers import SqlLexer
from pygments.formatters import TerminalFormatter
pygments_sql_lexer = SqlLexer()
pygments_terminal_formatter = TerminalFormatter()
highlight_sql = lambda s: highlight(s, pygments_sql_lexer,
pygments_terminal_formatter)
except ImportError:
highlight_sql = lambda s: s
def debug_sql(f):
"""
Turn SQL statement debugging on for a test run.
"""
@wraps(f)
def wrapper(*a, **kw):
from django.conf import settings
from django.db import connection
try:
debug = settings.DEBUG
settings.DEBUG = True
connection.queries = []
return f(*a, **kw)
finally:
total_time = 0
for q in connection.queries:
fmt = format_ok
t = float(q['time'])
total_time += t
if t > 1:
fmt = format_error
elif t > 0.3:
fmt = format_warning
print '[%s] %s' % (fmt(q['time']), highlight_sql(q['sql']))
print "total time =", total_time
print "num queries =", len(connection.queries)
settings.DEBUG = debug
return wrapper
你可以将pgsql服务器设置为记录每个查询,或者只记录慢查询。在postgresql.conf文件中查找,它非常接近自我记录。
看看这个问题(以及前两个答案): django orm,如何查看(或记录)执行的查询?
您还可以查看Djando文档: https://docs.djangoproject.com/en/dev/faq/models/#how-can-i-see-the-raw-sql-queries-django-is-running
希望这可以帮助到您, Anton
尝试使用Django调试工具栏。它会显示请求期间执行的所有SQL语句。当某些操作执行了太多查询时,速度会变得非常慢。为此,我一直想尝试这个分析器。然而,我已经在几个项目中使用了这个中间件:
try:
from cStringIO import StringIO
except ImportError:
import StringIO
from django.conf import settings
from django.db import connection
class DatabaseProfilerMiddleware(object):
def can(self, request):
return settings.DEBUG and 'dbprof' in request.GET
def process_response(self, request, response):
if self.can(request):
out = StringIO()
out.write('time sql\n')
total_time = 0
for query in reversed(sorted(connection.queries, key=lambda x: x['time'])):
total_time += float(query['time'])*1000
out.write('%s %s\n' % (query['time'], query['sql']))
response.content = '<pre style="white-space:pre-wrap">%d queries executed in %.3f seconds\n%s</pre>' \
% (len(connection.queries), total_time/1000, out.getvalue())
return response
dbprof
GET
参数,您将看到分析输出而不是正常响应。