似乎直接从 Django 中的查询集运行“解释”应该很容易,但我没有看到任何明显的方法,而且“解释”在文档中很难搜索。
问问题
13046 次
3 回答
36
好吧,除了工具栏外似乎什么都没有,所以我编写了自己的 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,)
希望这对其他人有用。
于 2012-07-13T20:57:40.060 回答
27
QuerySet.explain()
,在 Django 2.1.0 及更高版本中可用,现在是解释查询的官方方式。
于 2018-10-09T20:51:57.403 回答
19
只是对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,)
要使用,只需在查询集末尾调用 explain(),例如:
print SomeModel.objects.filter(...).explain()
于 2016-08-26T14:06:05.393 回答