Простой способ запустить "explain" на наборах запросов в django

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

2 ответов


Ну, кажется, там нет ничего, кроме панели инструментов, поэтому я написал свой собственный 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,)

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


просто небольшая модификация ответа гвидоизма. Это предотвращает получение 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,)

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

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