diff options
| author | Mike Bayer <mike_mp@zzzcomputing.com> | 2010-04-07 14:00:23 -0400 |
|---|---|---|
| committer | Mike Bayer <mike_mp@zzzcomputing.com> | 2010-04-07 14:00:23 -0400 |
| commit | a998ddf0c5737712dff8e653a10cd749da8dfbc8 (patch) | |
| tree | 79ee9afde1afc9db2f77c413b6fb96eb80c3c8dc /lib/sqlalchemy | |
| parent | 8b82b506eb6b5c35fcd897af230d41733e3c8444 (diff) | |
| parent | 5d61549f3db69b6edc75cc07cb3d114a5c9aee50 (diff) | |
| download | sqlalchemy-a998ddf0c5737712dff8e653a10cd749da8dfbc8.tar.gz | |
merge default
Diffstat (limited to 'lib/sqlalchemy')
| -rw-r--r-- | lib/sqlalchemy/engine/base.py | 32 | ||||
| -rw-r--r-- | lib/sqlalchemy/sql/expression.py | 17 |
2 files changed, 43 insertions, 6 deletions
diff --git a/lib/sqlalchemy/engine/base.py b/lib/sqlalchemy/engine/base.py index dc42ed957..4c5a6a82b 100644 --- a/lib/sqlalchemy/engine/base.py +++ b/lib/sqlalchemy/engine/base.py @@ -794,6 +794,14 @@ class Connection(Connectable): """ return self.engine.Connection(self.engine, self.__connection, _branch=True) + + def _clone(self): + """Create a shallow copy of this Connection. + + """ + c = self.__class__.__new__(self.__class__) + c.__dict__ = self.__dict__.copy() + return c def execution_options(self, **opt): """ Set non-SQL options for the connection which take effect during execution. @@ -811,9 +819,9 @@ class Connection(Connectable): :meth:`sqlalchemy.sql.expression.Executable.execution_options`. """ - return self.engine.Connection( - self.engine, self.__connection, - _branch=self.__branch, _execution_options=opt) + c = self._clone() + c._execution_options = c._execution_options.union(opt) + return c @property def dialect(self): @@ -1142,10 +1150,22 @@ class Connection(Connectable): else: keys = [] + if 'compiled_cache' in self._execution_options: + key = self.dialect, elem, tuple(keys), len(params) > 1 + if key in self._execution_options['compiled_cache']: + compiled_sql = self._execution_options['compiled_cache'][key] + else: + compiled_sql = elem.compile( + dialect=self.dialect, column_keys=keys, + inline=len(params) > 1) + self._execution_options['compiled_cache'][key] = compiled_sql + else: + compiled_sql = elem.compile( + dialect=self.dialect, column_keys=keys, + inline=len(params) > 1) + context = self.__create_execution_context( - compiled_sql=elem.compile( - dialect=self.dialect, column_keys=keys, - inline=len(params) > 1), + compiled_sql=compiled_sql, parameters=params ) return self.__execute_context(context) diff --git a/lib/sqlalchemy/sql/expression.py b/lib/sqlalchemy/sql/expression.py index 5958a0bc4..1222a144f 100644 --- a/lib/sqlalchemy/sql/expression.py +++ b/lib/sqlalchemy/sql/expression.py @@ -2276,6 +2276,23 @@ class Executable(_Generative): of many DBAPIs. The flag is currently understood only by the psycopg2 dialect. + * compiled_cache - a dictionary where :class:`Compiled` objects + will be cached when the :class:`Connection` compiles a clause + expression into a dialect- and parameter-specific + :class:`Compiled` object. It is the user's responsibility to + manage the size of this dictionary, which will have keys + corresponding to the dialect, clause element, the column + names within the VALUES or SET clause of an INSERT or UPDATE, + as well as the "batch" mode for an INSERT or UPDATE statement. + The format of this dictionary is not guaranteed to stay the + same in future releases. + + This option is usually more appropriate + to use via the + :meth:`sqlalchemy.engine.base.Connection.execution_options()` + method of :class:`Connection`, rather than upon individual + statement objects, though the effect is the same. + See also: :meth:`sqlalchemy.engine.base.Connection.execution_options()` |
