Refs #27624 -- Changed Query.explain_info to namedtuple.

This commit is contained in:
Adam Johnson 2021-09-14 18:08:19 +01:00 committed by Mariusz Felisiak
parent 2931d847c2
commit fc91ea1e50
2 changed files with 9 additions and 10 deletions

View File

@ -631,10 +631,10 @@ class SQLCompiler:
result.append('HAVING %s' % having)
params.extend(h_params)
if self.query.explain_query:
if self.query.explain_info:
result.insert(0, self.connection.ops.explain_query_prefix(
self.query.explain_format,
**self.query.explain_options
self.query.explain_info.format,
**self.query.explain_info.options
))
if order_by:
@ -1247,7 +1247,7 @@ class SQLCompiler:
result = list(self.execute_sql())
# Some backends return 1 item tuples with strings, and others return
# tuples with integers and strings. Flatten them out into strings.
output_formatter = json.dumps if self.query.explain_format == 'json' else str
output_formatter = json.dumps if self.query.explain_info.format == 'json' else str
for row in result[0]:
if not isinstance(row, str):
yield ' '.join(output_formatter(c) for c in row)

View File

@ -136,6 +136,9 @@ class RawQuery:
self.cursor.execute(self.sql, params)
ExplainInfo = namedtuple('ExplainInfo', ('format', 'options'))
class Query(BaseExpression):
"""A single SQL query."""
@ -227,9 +230,7 @@ class Query(BaseExpression):
self._filtered_relations = {}
self.explain_query = False
self.explain_format = None
self.explain_options = {}
self.explain_info = None
@property
def output_field(self):
@ -545,9 +546,7 @@ class Query(BaseExpression):
def explain(self, using, format=None, **options):
q = self.clone()
q.explain_query = True
q.explain_format = format
q.explain_options = options
q.explain_info = ExplainInfo(format, options)
compiler = q.get_compiler(using=using)
return '\n'.join(compiler.explain_query())