celia
12/22/2017 - 11:33 AM

Python - Explain querys

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)