Простой способ запустить "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()