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_0_11~16 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=3453822b54b5e0854e268bbf917903766bffbf8a;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 (cherry picked from commit d0fc7269888247517ffa16d9472f961ebec892a7) --- diff --git a/lib/sqlalchemy/orm/persistence.py b/lib/sqlalchemy/orm/persistence.py index c234225dc6..fc48dec25a 100644 --- a/lib/sqlalchemy/orm/persistence.py +++ b/lib/sqlalchemy/orm/persistence.py @@ -626,7 +626,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( @@ -641,6 +641,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 @@ -649,7 +651,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) @@ -736,7 +739,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( @@ -748,6 +751,8 @@ def _emit_insert_statements(base_mapper, uowtransaction, rec[6], rec[7])): + statement = cached_stmt + if not bookkeeping or \ ( has_all_defaults