]> git.ipfire.org Git - thirdparty/sqlalchemy/sqlalchemy.git/commitdiff
- attach the ResultMetaData to the Compiled object, when we detect that
authorMike Bayer <mike_mp@zzzcomputing.com>
Sun, 29 Jun 2014 04:10:59 +0000 (00:10 -0400)
committerMike Bayer <mike_mp@zzzcomputing.com>
Sun, 29 Jun 2014 04:10:59 +0000 (00:10 -0400)
the compiled cache is used.  That allows us to cache the whole metadata
and save on creating it at result time, when compiled cache is used.

lib/sqlalchemy/engine/result.py
lib/sqlalchemy/sql/compiler.py

index 6c98dae18631e69122aeaf41edcf042dd7fe723f..0838d810daf46fba5fd8ab95af2f9927119e0f4c 100644 (file)
@@ -269,9 +269,6 @@ class ResultMetaData(object):
         # high precedence keymap.
         keymap.update(primary_keymap)
 
-        if parent._echo:
-            context.engine.logger.debug(
-                "Col %r", tuple(x[0] for x in metadata))
 
     @util.pending_deprecation("0.8", "sqlite dialect uses "
                     "_translate_colname() now")
@@ -406,7 +403,18 @@ class ResultProxy(object):
     def _init_metadata(self):
         metadata = self._cursor_description()
         if metadata is not None:
-            self._metadata = ResultMetaData(self, metadata)
+            if self.context.compiled and \
+                    'compiled_cache' in self.context.execution_options:
+                if self.context.compiled._cached_metadata:
+                    self._metadata = self.context.compiled._cached_metadata
+                else:
+                    self._metadata = self.context.compiled._cached_metadata = \
+                        ResultMetaData(self, metadata)
+            else:
+                self._metadata = ResultMetaData(self, metadata)
+            if self._echo:
+                    self.context.engine.logger.debug(
+                    "Col %r", tuple(x[0] for x in metadata))
 
     def keys(self):
         """Return the current set of string keys for rows."""
index 11608ef3b95904e10b873e7589196ed6ce1b1ddb..010df5a1608625c06526e232fc2809e20c107c0d 100644 (file)
@@ -170,6 +170,8 @@ class Compiled(object):
     defaults.
     """
 
+    _cached_metadata = None
+
     def __init__(self, dialect, statement, bind=None,
                 compile_kwargs=util.immutabledict()):
         """Construct a new ``Compiled`` object.