Подтвердить что ты не робот

Легкий способ запускать "объяснять" на наборах запросов в django

Кажется, должно быть легко запустить "объяснять" непосредственно из набора запросов в Django, но я не вижу ничего очевидного в том, как это сделать, и "объяснить" - это трудная вещь, которую нужно искать в Docs.

4b9b3361

Ответ 1

Ну, похоже, ничего нет, кроме панели инструментов, поэтому я написал свой собственный mixin, чтобы дать мне метод explain() в моих запросах:

from django.db import connections
from django.db.models.query import QuerySet

class QuerySetExplainMixin:
    def explain(self):
        cursor = connections[self.db].cursor()
        cursor.execute('explain %s' % str(self.query))
        return cursor.fetchall()

QuerySet.__bases__ += (QuerySetExplainMixin,)

Надеюсь, это полезно для других.

Ответ 2

Просто небольшое изменение в ответе руководства. Это предотвращает получение ошибки ProgrammingError: syntax error at or near ..., вызванной неправильным экранированием параметров в необработанном запросе:

from django.db import connections
from django.db.models.query import QuerySet

class QuerySetExplainMixin:
    def explain(self):
        cursor = connections[self.db].cursor()
        query, params = self.query.sql_with_params()
        cursor.execute('explain %s' % query, params)
        return '\n'.join(r[0] for r in cursor.fetchall())

QuerySet.__bases__ += (QuerySetExplainMixin,)

Чтобы использовать, просто вызовите объяснение() в конце вашего набора запросов, например:

print SomeModel.objects.filter(...).explain()