django

2012-07-13 23 views
19

में क्वेरी सेट पर "व्याख्या" चलाने का आसान तरीका ऐसा लगता है जैसे Django में एक क्वेरीसेट से सीधे "व्याख्या" करना आसान होना चाहिए, लेकिन मुझे यह कैसे करना है इसके बारे में कुछ भी स्पष्ट नहीं दिख रहा है, और दस्तावेज़ों में खोजना मुश्किल है "व्याख्या करें"।django

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

उम्मीद है कि यह अन्य लोगों के लिए उपयोगी है:

उत्तर

23

ठीक है, तो मैं मुझे मेरे क्वेरीसमूहों पर एक explain() विधि देने के लिए अपने ही mixin लिखा कुछ भी नहीं वहाँ एक उपकरण पट्टी को छोड़कर हो रहा है।

+6

कृपया django परियोजना के लिए टिकट खोलने पर विचार करें। मुझे यह बिल्टिन देखना अच्छा लगेगा। –

+0

उपयोगी दिखता है, वास्तव में इसका उपयोग करने के उदाहरण के साथ और भी अधिक होगा। – szeitlin

+0

धन्यवाद! यह स्वादिष्ट है! – mkoistinen

11

Guidoism के जवाब के लिए बस थोड़ा सा संशोधन।

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

का उपयोग करने के लिए बस आह्वान समझाने() अपने क्वेरीसमूह के अंत में, उदाहरण के लिए:: यह एक ProgrammingError: syntax error at or near ... पैरामीटर सही ढंग से कच्चे क्वेरी में भाग निकले नहीं किये जाने के कारण त्रुटि मिल रही रोकता

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