diff options
-rw-r--r-- | lib/sqlalchemy/orm/mapper.py | 36 |
1 files changed, 15 insertions, 21 deletions
diff --git a/lib/sqlalchemy/orm/mapper.py b/lib/sqlalchemy/orm/mapper.py index ffccfabf9..ff4586f2c 100644 --- a/lib/sqlalchemy/orm/mapper.py +++ b/lib/sqlalchemy/orm/mapper.py @@ -1338,7 +1338,11 @@ class Mapper(object): post_update_cols=post_update_cols, single=True) return - + + cached_connections = util.PopulateDict(lambda conn:conn.execution_options( + compiled_cache=self._compiled_cache.setdefault(conn.engine, {}) + )) + # if session has a connection callable, # organize individual states with the connection # to use for insert/update @@ -1356,7 +1360,7 @@ class Mapper(object): conn = connection_callable(self, state.obj()) else: conn = connection - + has_identity = state.has_identity mapper = _state_mapper(state) instance_key = state.key or mapper._identity_key_from_state(state) @@ -1407,8 +1411,6 @@ class Mapper(object): table_to_mapper = self._sorted_tables - compiled_cache = self._compiled_cache - for table in table_to_mapper: insert = [] update = [] @@ -1482,7 +1484,8 @@ class Mapper(object): col not in post_update_cols: if col in pks: params[col._label] = \ - mapper._get_state_attr_by_column(state, state_dict, col) + mapper._get_state_attr_by_column( + state, state_dict, col) continue prop = mapper._columntoproperty[col] @@ -1556,11 +1559,7 @@ class Mapper(object): if value_params: c = connection.execute(statement.values(value_params), params) else: - c = connection.\ - execution_options(compiled_cache=\ - compiled_cache.setdefault( - connection.engine, {}) - ).execute(statement, params) + c = cached_connections[connection].execute(statement, params) mapper._postfetch(uowtransaction, table, state, state_dict, c, @@ -1590,11 +1589,7 @@ class Mapper(object): if value_params: c = connection.execute(statement.values(value_params), params) else: - c = connection.\ - execution_options(compiled_cache=\ - compiled_cache.setdefault( - connection.engine, {}) - ).execute(statement, params) + c = cached_connections[connection].execute(statement, params) primary_key = c.inserted_primary_key @@ -1703,6 +1698,10 @@ class Mapper(object): connection_callable = None tups = [] + cached_connections = util.PopulateDict(lambda conn:conn.execution_options( + compiled_cache=self._compiled_cache.setdefault(conn.engine, {}) + )) + for state in _sort_states(states): mapper = _state_mapper(state) @@ -1722,8 +1721,6 @@ class Mapper(object): table_to_mapper = self._sorted_tables - compiled_cache = self._compiled_cache - for table in reversed(table_to_mapper.keys()): delete = util.defaultdict(list) for state, state_dict, mapper, has_identity, connection in tups: @@ -1764,10 +1761,7 @@ class Mapper(object): statement = self._memo(('delete', table), delete_stmt) rows = -1 - connection = connection.execution_options( - compiled_cache=compiled_cache.setdefault( - connection.engine, - {})) + connection = cached_connections[connection] if need_version_id and \ not connection.dialect.supports_sane_multi_rowcount: |