在django中对查询集运行"解释"的简便方法

gui*_*ism 26 django sql-execution-plan

看起来直接从Django中的查询集运行"解释"应该很容易,但我没有看到任何明显的如何做到这一点,并且"解释"在文档中搜索是一件困难的事情.

gui*_*ism 29

好吧,除了工具栏之外似乎什么都没有,所以我编写了自己的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,)
Run Code Online (Sandbox Code Playgroud)

希望这对其他人有用.

  • 请考虑为django项目开票.我很乐意看到这个内置. (7认同)
  • 这已经内置到Django中了 https://github.com/django/django/blob/858cfd74e958b63e81657e5a9fc5f751c19e8192/django/db/models/query.py#L772-L773 (4认同)

小智 15

只是对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,)
Run Code Online (Sandbox Code Playgroud)

要使用,只需在查询集的末尾调用explain(),例如:

print SomeModel.objects.filter(...).explain()
Run Code Online (Sandbox Code Playgroud)


orn*_*688 11

QuerySet.explain(),在Django 2.1.0及更高版本中可用,现在是解释查询的官方方式.