2012-07-13 15 views
19

Django'daki bir sorgulamadan doğrudan "açıkla" çalıştırmanın kolay olması gerektiği gibi görünüyor, ancak nasıl yapılacağı konusunda açık bir şey göremiyorum. "açıkla", dokümanlar içinde aramak için zor bir şeydir.Django'daki sorgu kümelerinde "açıkla" çalıştırmanın kolay yolu

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

Umarım bu başkalarına yararlıdır:

cevap

23

Eh, benim Sorgu kümelerini bana bir explain() yöntemi vermek için kendi mixin yazdığı bu yüzden bir araç çubuğu dışında orada hiçbir sebep yok gibi görünüyor.

+6

Lütfen Bu doğru çiğ sorguda kaçan olmamak parametrelerinin neden olduğu bir ProgrammingError: syntax error at or near ... hata alıyorum önler django projesi için bir bilet açmayı düşünün. Bu yerleşmeyi görmek isterim. –

+0

Yararlı görünüyor, aslında nasıl kullanılacağını gösteren bir örnekle daha da iyi olurdu. – szeitlin

+0

Teşekkürler! Bu lezzetli! – mkoistinen

11

Guidoizmin cevabı için sadece ufak bir değişiklik.

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

basitçe çağırmak (açıklamak, kullanmak için) sizin sorgu kümesi sonunda örn:

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