select_related - prefetch django
Manera fácil de ejecutar “explicar” en conjuntos de consultas en django (3)
Parece que debería ser fácil de ejecutar "explicar" directamente de un queryset en Django, pero no veo nada obvio sobre cómo hacerlo, y "explicar" es una cosa difícil de buscar en los documentos.
Solo una ligera modificación a la respuesta del guidoísmo. Esto evita que se produzca un ProgrammingError: syntax error at or near ...
error causado por los parámetros que no se escapan correctamente en la consulta sin formato:
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,)
Para usarlo, simplemente invoque explique () al final de su consulta, por ejemplo:
print SomeModel.objects.filter(...).explain()
QuerySet.explain()
, disponible en Django 2.1.0 y superior, es ahora la forma oficial de explicar las consultas.
Bueno, parece que no hay nada por ahí excepto una barra de herramientas, así que escribí mi propia mezcla para darme un método de explain()
en mis consultas:
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,)
Esperemos que esto sea útil para otros.