summaryrefslogtreecommitdiff
path: root/lib/sqlalchemy/orm/persistence.py
diff options
context:
space:
mode:
authorMike Bayer <mike_mp@zzzcomputing.com>2015-01-17 21:36:52 -0500
committerMike Bayer <mike_mp@zzzcomputing.com>2015-01-17 21:58:49 -0500
commitf49c367ef712d080e630ba722f96903922d7de7b (patch)
tree003e894ee985784fc8806f735d7a28c53580e01e /lib/sqlalchemy/orm/persistence.py
parent469b6fabaf78fa0aad485005fd7bc8be7fe27f92 (diff)
downloadsqlalchemy-f49c367ef712d080e630ba722f96903922d7de7b.tar.gz
- fix a regression from ref #3178, where dialects that don't actually support
sane multi rowcount (e.g. pyodbc) would fail on multirow update. add a test that mocks this breakage into plain dialects
Diffstat (limited to 'lib/sqlalchemy/orm/persistence.py')
-rw-r--r--lib/sqlalchemy/orm/persistence.py16
1 files changed, 12 insertions, 4 deletions
diff --git a/lib/sqlalchemy/orm/persistence.py b/lib/sqlalchemy/orm/persistence.py
index f477e1dd7..dbf1d3eb4 100644
--- a/lib/sqlalchemy/orm/persistence.py
+++ b/lib/sqlalchemy/orm/persistence.py
@@ -617,6 +617,14 @@ def _emit_update_statements(base_mapper, uowtransaction,
rows = 0
records = list(records)
+ # 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
+ assert_singlerow = connection.dialect.supports_sane_rowcount
+ assert_multirow = assert_singlerow and \
+ connection.dialect.supports_sane_multi_rowcount
+ allow_multirow = not needs_version_id or assert_multirow
+
if hasvalue:
for state, state_dict, params, mapper, \
connection, value_params in records:
@@ -635,9 +643,7 @@ def _emit_update_statements(base_mapper, uowtransaction,
value_params)
rows += c.rowcount
else:
- if needs_version_id and \
- not connection.dialect.supports_sane_multi_rowcount and \
- connection.dialect.supports_sane_rowcount:
+ if not allow_multirow:
for state, state_dict, params, mapper, \
connection, value_params in records:
c = cached_connections[connection].\
@@ -654,6 +660,7 @@ def _emit_update_statements(base_mapper, uowtransaction,
rows += c.rowcount
else:
multiparams = [rec[2] for rec in records]
+
c = cached_connections[connection].\
execute(statement, multiparams)
@@ -670,7 +677,8 @@ def _emit_update_statements(base_mapper, uowtransaction,
c.context.compiled_parameters[0],
value_params)
- if connection.dialect.supports_sane_rowcount:
+ if assert_multirow or assert_singlerow and \
+ len(multiparams) == 1:
if rows != len(records):
raise orm_exc.StaleDataError(
"UPDATE statement on table '%s' expected to "