2012-07-13 63 views

回答

23

好了,似乎有什麼在那裏只是一個工具欄,所以我寫了我自己的mixin給我上我的查詢集的explain()方法:

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

希望這是對別人有用。

+6

請考慮爲django項目打開一張票。我很樂意看到這個內建。 – 2012-07-14 00:39:57

+0

看起來很有用,如果真正使用它的例子更是如此。 – szeitlin 2016-03-15 21:58:46

+0

謝謝!這個好吃! – mkoistinen 2017-09-09 16:17:45

11

只是對guidoism的答案稍作修改。這可防止得到一個ProgrammingError: syntax error at or near ...錯誤造成的不正確的原始查詢逃過參數:

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

要使用,只需調用解釋()在你的查詢集的結尾,例如:

print SomeModel.objects.filter(...).explain() 
相關問題