From: Mike Bayer Date: Mon, 14 Dec 2015 22:53:56 +0000 (-0500) Subject: - since we are mutating the statement in a loop, start with X-Git-Tag: rel_1_1_0b1~84^2~77^2~6 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=d0fc7269888247517ffa16d9472f961ebec892a7;p=thirdparty%2Fsqlalchemy%2Fsqlalchemy.git - since we are mutating the statement in a loop, start with the same cached starting statement each time. no issue has been observed with the former but it could perhaps have issues w/ versioning or eager_defaults --- diff --git a/lib/sqlalchemy/orm/persistence.py b/lib/sqlalchemy/orm/persistence.py index 77c513aef4..e6a2c0634c 100644 --- a/lib/sqlalchemy/orm/persistence.py +++ b/lib/sqlalchemy/orm/persistence.py @@ -628,7 +628,7 @@ def _emit_update_statements(base_mapper, uowtransaction, stmt = table.update(clause) return stmt - statement = base_mapper._memo(('update', table), update_stmt) + cached_stmt = base_mapper._memo(('update', table), update_stmt) for (connection, paramkeys, hasvalue, has_all_defaults), \ records in groupby( @@ -643,6 +643,8 @@ def _emit_update_statements(base_mapper, uowtransaction, rows = 0 records = list(records) + statement = cached_stmt + # TODO: would be super-nice to not have to determine this boolean # inside the loop here, in the 99.9999% of the time there's only # one connection in use @@ -651,7 +653,8 @@ def _emit_update_statements(base_mapper, uowtransaction, connection.dialect.supports_sane_multi_rowcount allow_multirow = has_all_defaults and not needs_version_id - if bookkeeping and mapper.base_mapper.eager_defaults: + if bookkeeping and not has_all_defaults and \ + mapper.base_mapper.eager_defaults: statement = statement.return_defaults() elif mapper.version_id_col is not None: statement = statement.return_defaults(mapper.version_id_col) @@ -739,7 +742,7 @@ def _emit_insert_statements(base_mapper, uowtransaction, """Emit INSERT statements corresponding to value lists collected by _collect_insert_commands().""" - statement = base_mapper._memo(('insert', table), table.insert) + cached_stmt = base_mapper._memo(('insert', table), table.insert) for (connection, pkeys, hasvalue, has_all_pks, has_all_defaults), \ records in groupby( @@ -751,6 +754,8 @@ def _emit_insert_statements(base_mapper, uowtransaction, rec[6], rec[7])): + statement = cached_stmt + if not bookkeeping or \ ( has_all_defaults