diff options
| author | Mike Bayer <mike_mp@zzzcomputing.com> | 2016-01-11 14:35:56 -0500 |
|---|---|---|
| committer | Mike Bayer <mike_mp@zzzcomputing.com> | 2016-01-11 16:44:28 -0500 |
| commit | 6fbfadc7388dad4576ad99ce597e0878ee1d297f (patch) | |
| tree | 2aeaeec66050d6377ae719f825b6d5f45ea62252 /lib/sqlalchemy/engine | |
| parent | b301f009e18246db9277a4b9d7e3a1bf01a92ae9 (diff) | |
| download | sqlalchemy-6fbfadc7388dad4576ad99ce597e0878ee1d297f.tar.gz | |
- reorganize schema_translate_map to be succinct and gain the performance
back by using an attrgetter for the default case
Diffstat (limited to 'lib/sqlalchemy/engine')
| -rw-r--r-- | lib/sqlalchemy/engine/base.py | 56 | ||||
| -rw-r--r-- | lib/sqlalchemy/engine/default.py | 10 | ||||
| -rw-r--r-- | lib/sqlalchemy/engine/interfaces.py | 2 | ||||
| -rw-r--r-- | lib/sqlalchemy/engine/reflection.py | 3 | ||||
| -rw-r--r-- | lib/sqlalchemy/engine/strategies.py | 6 |
5 files changed, 52 insertions, 25 deletions
diff --git a/lib/sqlalchemy/engine/base.py b/lib/sqlalchemy/engine/base.py index 79b5f57d1..0b928566d 100644 --- a/lib/sqlalchemy/engine/base.py +++ b/lib/sqlalchemy/engine/base.py @@ -14,6 +14,7 @@ from __future__ import with_statement import sys from .. import exc, util, log, interfaces from ..sql import util as sql_util +from ..sql import schema from .interfaces import Connectable, ExceptionContext from .util import _distill_params import contextlib @@ -44,7 +45,21 @@ class Connection(Connectable): """ - _schema_translate_map = None + schema_for_object = schema._schema_getter(None) + """Return the ".schema" attribute for an object. + + Used for :class:`.Table`, :class:`.Sequence` and similar objects, + and takes into account + the :paramref:`.Connection.execution_options.schema_translate_map` + parameter. + + .. versionadded:: 1.1 + + .. seealso:: + + :ref:`schema_translating` + + """ def __init__(self, engine, connection=None, close_with_result=False, _branch_from=None, _execution_options=None, @@ -69,7 +84,7 @@ class Connection(Connectable): self.should_close_with_result = False self.dispatch = _dispatch self._has_events = _branch_from._has_events - self._schema_translate_map = _branch_from._schema_translate_map + self.schema_for_object = _branch_from.schema_for_object else: self.__connection = connection \ if connection is not None else engine.raw_connection() @@ -143,13 +158,6 @@ class Connection(Connectable): c.__dict__ = self.__dict__.copy() return c - def _get_effective_schema(self, table): - effective_schema = table.schema - if self._schema_translate_map: - effective_schema = self._schema_translate_map.get( - effective_schema, effective_schema) - return effective_schema - def __enter__(self): return self @@ -984,7 +992,8 @@ class Connection(Connectable): compiled = ddl.compile( dialect=dialect, - schema_translate_map=self._schema_translate_map) + schema_translate_map=self.schema_for_object + if not self.schema_for_object.is_default else None) ret = self._execute_context( dialect, dialect.execution_ctx_cls._init_ddl, @@ -1017,10 +1026,7 @@ class Connection(Connectable): if 'compiled_cache' in self._execution_options: key = ( dialect, elem, tuple(sorted(keys)), - tuple( - (k, self._schema_translate_map[k]) - for k in sorted(self._schema_translate_map) - ) if self._schema_translate_map else None, + self.schema_for_object.hash_key, len(distilled_params) > 1 ) compiled_sql = self._execution_options['compiled_cache'].get(key) @@ -1028,14 +1034,16 @@ class Connection(Connectable): compiled_sql = elem.compile( dialect=dialect, column_keys=keys, inline=len(distilled_params) > 1, - schema_translate_map=self._schema_translate_map + schema_translate_map=self.schema_for_object + if not self.schema_for_object.is_default else None ) self._execution_options['compiled_cache'][key] = compiled_sql else: compiled_sql = elem.compile( dialect=dialect, column_keys=keys, inline=len(distilled_params) > 1, - schema_translate_map=self._schema_translate_map) + schema_translate_map=self.schema_for_object + if not self.schema_for_object.is_default else None) ret = self._execute_context( dialect, @@ -1721,6 +1729,22 @@ class Engine(Connectable, log.Identified): _has_events = False _connection_cls = Connection + schema_for_object = schema._schema_getter(None) + """Return the ".schema" attribute for an object. + + Used for :class:`.Table`, :class:`.Sequence` and similar objects, + and takes into account + the :paramref:`.Connection.execution_options.schema_translate_map` + parameter. + + .. versionadded:: 1.1 + + .. seealso:: + + :ref:`schema_translating` + + """ + def __init__(self, pool, dialect, url, logging_name=None, echo=None, proxy=None, execution_options=None diff --git a/lib/sqlalchemy/engine/default.py b/lib/sqlalchemy/engine/default.py index 160fe545e..6c42af8b1 100644 --- a/lib/sqlalchemy/engine/default.py +++ b/lib/sqlalchemy/engine/default.py @@ -16,7 +16,7 @@ as the base class for their own corresponding classes. import re import random from . import reflection, interfaces, result -from ..sql import compiler, expression +from ..sql import compiler, expression, schema from .. import types as sqltypes from .. import exc, util, pool, processors import codecs @@ -399,16 +399,20 @@ class DefaultDialect(interfaces.Dialect): self._set_connection_isolation(connection, isolation_level) if 'schema_translate_map' in opts: + getter = schema._schema_getter(opts['schema_translate_map']) + engine.schema_for_object = getter + @event.listens_for(engine, "engine_connect") def set_schema_translate_map(connection, branch): - connection._schema_translate_map = opts['schema_translate_map'] + connection.schema_for_object = getter def set_connection_execution_options(self, connection, opts): if 'isolation_level' in opts: self._set_connection_isolation(connection, opts['isolation_level']) if 'schema_translate_map' in opts: - connection._schema_translate_map = opts['schema_translate_map'] + getter = schema._schema_getter(opts['schema_translate_map']) + connection.schema_for_object = getter def _set_connection_isolation(self, connection, level): if connection.in_transaction(): diff --git a/lib/sqlalchemy/engine/interfaces.py b/lib/sqlalchemy/engine/interfaces.py index 41325878c..c84823d1e 100644 --- a/lib/sqlalchemy/engine/interfaces.py +++ b/lib/sqlalchemy/engine/interfaces.py @@ -7,7 +7,7 @@ """Define core interfaces used by the engine system.""" -from .. import util, event +from .. import util # backwards compat from ..sql.compiler import Compiled, TypeCompiler diff --git a/lib/sqlalchemy/engine/reflection.py b/lib/sqlalchemy/engine/reflection.py index 17d9958bb..6880660ce 100644 --- a/lib/sqlalchemy/engine/reflection.py +++ b/lib/sqlalchemy/engine/reflection.py @@ -529,8 +529,7 @@ class Inspector(object): """ dialect = self.bind.dialect - with self.bind.connect() as conn: - schema = conn._get_effective_schema(table) + schema = self.bind.schema_for_object(table) table_name = table.name diff --git a/lib/sqlalchemy/engine/strategies.py b/lib/sqlalchemy/engine/strategies.py index cb3e6fa8a..d8e2d4764 100644 --- a/lib/sqlalchemy/engine/strategies.py +++ b/lib/sqlalchemy/engine/strategies.py @@ -18,8 +18,9 @@ New strategies can be added via new ``EngineStrategy`` classes. from operator import attrgetter from sqlalchemy.engine import base, threadlocal, url -from sqlalchemy import util, exc, event +from sqlalchemy import util, event from sqlalchemy import pool as poollib +from sqlalchemy.sql import schema strategies = {} @@ -233,8 +234,7 @@ class MockEngineStrategy(EngineStrategy): dialect = property(attrgetter('_dialect')) name = property(lambda s: s._dialect.name) - def _get_effective_schema(self, table): - return table.schema + schema_for_object = schema._schema_getter(None) def contextual_connect(self, **kwargs): return self |
