Explain query
class ExplainResult(object):
def __init__(self, sql, explain):
self.sql = sql
self.explain = explain
def pretty_print(self):
print(self.explain)
def get_depesz_url(self):
payload = {"title": "default", "plan": self.explain}
url = "https://explain.depesz.com"
response = requests.post(url=url, data=payload)
response.raise_for_status()
return url + response.headers.get("Location")
def explain(query, analyze=True):
# Si estamos conectados con Django admin, usamos:
from django.db import connection
# Si no estamos conectados con Django admin, ¿de qué módulo es "connections"?
#connection = connections[query.db]
with connection.cursor() as c:
sql, params = query.query.sql_with_params()
tmpl = "EXPLAIN {sql}"
if analyze:
tmpl = "EXPLAIN ANALYZE {sql}"
c.execute(tmpl.format(sql=sql), params)
explain_data = "\n".join([i[0] for i in c.fetchall()])
return ExplainResult(sql=str(query.query), explain=explain_data)
# Cómo usar desde un main
results = MyModel.objects.filter(<myFilter>)
explain(results)
# Cómo usar desde una clase arrancada con Django Admin
explain_result = explain(bookings)
res = explain_result.get_depesz_url()
print(res)