From fc91ea1e50e5ef207f0f291b3f6c1942b10db7c7 Mon Sep 17 00:00:00 2001 From: Adam Johnson Date: Tue, 14 Sep 2021 18:08:19 +0100 Subject: [PATCH] Refs #27624 -- Changed Query.explain_info to namedtuple. --- django/db/models/sql/compiler.py | 8 ++++---- django/db/models/sql/query.py | 11 +++++------ 2 files changed, 9 insertions(+), 10 deletions(-) diff --git a/django/db/models/sql/compiler.py b/django/db/models/sql/compiler.py index 6b2ea0e017a..97288c83d7a 100644 --- a/django/db/models/sql/compiler.py +++ b/django/db/models/sql/compiler.py @@ -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) diff --git a/django/db/models/sql/query.py b/django/db/models/sql/query.py index 433824044d3..9427c05c218 100644 --- a/django/db/models/sql/query.py +++ b/django/db/models/sql/query.py @@ -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())