2012-07-13 8 views

risposta

23

Beh, sembra che ci sia niente là fuori tranne una barra degli strumenti così ho scritto il mio mixin di darmi un metodo explain() sui miei set di query:

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,) 

Speriamo che questo sia utile per gli altri.

+6

prega prendere in considerazione l'apertura di un biglietto per il progetto Django. Mi piacerebbe vedere questo builtin. –

+0

Sembra utile, lo sarebbe ancora di più con un esempio di come effettivamente usarlo. – szeitlin

+0

Grazie! È delizioso! – mkoistinen

11

Solo una leggera modifica alla risposta del guidoism. Questo impedisce di ottenere un errore di ProgrammingError: syntax error at or near ... causato dai parametri non essere correttamente sfuggiti nella query prima:

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,) 

da usare, basta richiamare spiegare() alla fine del set di query, ad esempio:

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