36

似乎直接从 Django 中的查询集运行“解释”应该很容易,但我没有看到任何明显的方法,而且“解释”在文档中很难搜索。

4

3 回答 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 回答