mirror of
				https://github.com/django/django.git
				synced 2025-10-31 09:41:08 +00:00 
			
		
		
		
	Refs #28459 -- Improved performance of SQLCompiler.results_iter().
This commit is contained in:
		
				
					committed by
					
						 Tim Graham
						Tim Graham
					
				
			
			
				
	
			
			
			
						parent
						
							50a97edc1a
						
					
				
				
					commit
					ca46f4688c
				
			| @@ -1227,9 +1227,9 @@ class RawQuerySet: | |||||||
|             converters = compiler.get_converters([ |             converters = compiler.get_converters([ | ||||||
|                 f.get_col(f.model._meta.db_table) if f else None for f in fields |                 f.get_col(f.model._meta.db_table) if f else None for f in fields | ||||||
|             ]) |             ]) | ||||||
|             for values in query: |  | ||||||
|             if converters: |             if converters: | ||||||
|                     values = compiler.apply_converters(values, converters) |                 query = compiler.apply_converters(query, converters) | ||||||
|  |             for values in query: | ||||||
|                 # Associate fields to values |                 # Associate fields to values | ||||||
|                 model_init_values = [values[pos] for pos in model_init_pos] |                 model_init_values = [values[pos] for pos in model_init_pos] | ||||||
|                 instance = model_cls.from_db(db, model_init_names, model_init_values) |                 instance = model_cls.from_db(db, model_init_names, model_init_values) | ||||||
|   | |||||||
| @@ -938,14 +938,17 @@ class SQLCompiler: | |||||||
|                     converters[i] = (convs, expression) |                     converters[i] = (convs, expression) | ||||||
|         return converters |         return converters | ||||||
|  |  | ||||||
|     def apply_converters(self, row, converters): |     def apply_converters(self, rows, converters): | ||||||
|  |         connection = self.connection | ||||||
|  |         converters = list(converters.items()) | ||||||
|  |         for row in rows: | ||||||
|             row = list(row) |             row = list(row) | ||||||
|         for pos, (convs, expression) in converters.items(): |             for pos, (convs, expression) in converters: | ||||||
|                 value = row[pos] |                 value = row[pos] | ||||||
|                 for converter in convs: |                 for converter in convs: | ||||||
|                 value = converter(value, expression, self.connection) |                     value = converter(value, expression, connection) | ||||||
|                 row[pos] = value |                 row[pos] = value | ||||||
|         return tuple(row) |             yield tuple(row) | ||||||
|  |  | ||||||
|     def results_iter(self, results=None): |     def results_iter(self, results=None): | ||||||
|         """Return an iterator over the results from executing this query.""" |         """Return an iterator over the results from executing this query.""" | ||||||
| @@ -953,11 +956,10 @@ class SQLCompiler: | |||||||
|             results = self.execute_sql(MULTI) |             results = self.execute_sql(MULTI) | ||||||
|         fields = [s[0] for s in self.select[0:self.col_count]] |         fields = [s[0] for s in self.select[0:self.col_count]] | ||||||
|         converters = self.get_converters(fields) |         converters = self.get_converters(fields) | ||||||
|         for rows in results: |         rows = chain.from_iterable(results) | ||||||
|             for row in rows: |  | ||||||
|         if converters: |         if converters: | ||||||
|                     row = self.apply_converters(row, converters) |             rows = self.apply_converters(rows, converters) | ||||||
|                 yield row |         return rows | ||||||
|  |  | ||||||
|     def has_results(self): |     def has_results(self): | ||||||
|         """ |         """ | ||||||
|   | |||||||
| @@ -464,7 +464,7 @@ class Query: | |||||||
|             result = [None for q in outer_query.annotation_select.items()] |             result = [None for q in outer_query.annotation_select.items()] | ||||||
|  |  | ||||||
|         converters = compiler.get_converters(outer_query.annotation_select.values()) |         converters = compiler.get_converters(outer_query.annotation_select.values()) | ||||||
|         result = compiler.apply_converters(result, converters) |         result = next(compiler.apply_converters((result,), converters)) | ||||||
|  |  | ||||||
|         return { |         return { | ||||||
|             alias: val |             alias: val | ||||||
|   | |||||||
		Reference in New Issue
	
	Block a user