2012-07-13 25 views

Trả lời

23

Vâng, có vẻ là không có gì ngoài kia, ngoại trừ một thanh công cụ vì vậy tôi đã viết mixin của riêng tôi để cho tôi một phương pháp explain() trên queryset tôi:

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

Hy vọng rằng đây là hữu ích cho người khác.

+6

Hãy xem xét việc mở một vé cho dự án django. Tôi rất thích xem nội trang này. –

+0

Có vẻ hữu ích, thậm chí còn hữu ích hơn với ví dụ về cách sử dụng nó. – szeitlin

+0

Cảm ơn bạn! Cái này ngon quá! – mkoistinen

11

Chỉ cần một sửa đổi nhỏ cho câu trả lời của guidoism. Điều này ngăn cản nhận được một lỗi ProgrammingError: syntax error at or near ... do các thông số không được trốn thoát một cách chính xác trong truy vấn liệu:

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

Để sử dụng, bạn chỉ cần gọi giải thích() vào cuối queryset của bạn, ví dụ:

print SomeModel.objects.filter(...).explain() 
Các vấn đề liên quan