Browse Source

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

Adam Johnson 3 years ago
parent
commit
fc91ea1e50
2 changed files with 9 additions and 10 deletions
  1. 4 4
      django/db/models/sql/compiler.py
  2. 5 6
      django/db/models/sql/query.py

+ 4 - 4
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)

+ 5 - 6
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())