Получение всех запросов, которые django запускает на postgresql - PullRequest
4 голосов
/ 07 ноября 2010

Я работаю над проектом django-postgresql, и мне нужно видеть каждый запрос, который django запускает в базе данных (поэтому я могу точно настроить запросы).Есть ли способ получить эти запросы.Обновление: Моя среда разработки находится на Ubuntu Linux

Ответы [ 4 ]

1 голос
/ 02 мая 2012

Вы можете украсить обработчик запроса или другую функцию с помощью этого, и он напечатает sql, хорошо отформатированный с итогами в конце.

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
1 голос
/ 16 ноября 2010

Ну, вы можете просто настроить сервер pgsql на запись каждого запроса.Или просто для регистрации медленных.Посмотрите в файле postgresql.conf, он довольно близок к самодокументированию.

1 голос
/ 21 сентября 2011

Проверьте этот вопрос (и два самых популярных ответа): django orm, как просмотреть (или зарегистрировать) выполненный запрос?

Вы также можете взглянуть на документацию Djando: https://docs.djangoproject.com/en/dev/faq/models/#how-can-i-see-the-raw-sql-queries-django-is-running

Надеюсь, это поможет, Anton

0 голосов
/ 07 ноября 2010

Попробуйте панель инструментов отладки django . Он покажет вам весь SQL, выполненный над запросом. Когда что-то выполняет слишком много запросов, это становится очень медленным. Для этого я хотел попробовать этот профилировщик . Тем не менее, я развернул это промежуточное ПО на нескольких проектах:

<code>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=&quot;white-space:pre-wrap&quot;>%d queries executed in %.3f seconds\n%s
'\ % (len (connection.queries), total_time / 1000, out.getvalue ()) обратный ответ

Просто перейдите по соответствующему URL-адресу для запроса, который вас интересует, и добавьте параметр dbprof GET, вы увидите результат профилирования вместо обычного ответа.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...