summaryrefslogtreecommitdiff
path: root/lib/sqlalchemy/sql/crud.py
diff options
context:
space:
mode:
authorGorka Eguileor <geguileo@redhat.com>2015-09-29 20:29:33 +0200
committerGorka Eguileor <geguileo@redhat.com>2015-09-29 20:29:33 +0200
commit9fb76d759678558f6fd087dcc04de3f2daa3a571 (patch)
tree4d4155a79fe49d3f97e5e734acaf20b83684d9fd /lib/sqlalchemy/sql/crud.py
parentfc73036865a0c0d2809b66fcfdc663ff425f4267 (diff)
downloadsqlalchemy-9fb76d759678558f6fd087dcc04de3f2daa3a571.tar.gz
Only preserve order in updates if tuple/dict
To avoid penalties for updates that do not require ordering, we will only use OrderedDict for updates that receive a tuple or list of pairs, and all kinds of dictionaries (dict, sqlalchemy's OrderedDict, or collections.OrderedDict) will be treateated as unordered updates, just like we were doing before. This way this new feature will not change how updates behave for any existing code and will only affect those that use the new ordered feature. This patch reverts update tests to how they were before as well as adds a couple of tests to confirm that OrderedDicts are really treated like normal dicts.
Diffstat (limited to 'lib/sqlalchemy/sql/crud.py')
-rw-r--r--lib/sqlalchemy/sql/crud.py21
1 files changed, 15 insertions, 6 deletions
diff --git a/lib/sqlalchemy/sql/crud.py b/lib/sqlalchemy/sql/crud.py
index 614f9413b..235889ad9 100644
--- a/lib/sqlalchemy/sql/crud.py
+++ b/lib/sqlalchemy/sql/crud.py
@@ -14,6 +14,8 @@ from .. import exc
from . import elements
import operator
+from sqlalchemy.sql import util as sql_util
+
REQUIRED = util.symbol('REQUIRED', """
Placeholder for the value within a :class:`.BindParameter`
which is required to be present when the statement is passed
@@ -26,7 +28,7 @@ values present.
""")
-def _get_crud_params(compiler, stmt, keep_order=False, **kw):
+def _get_crud_params(compiler, stmt, **kw):
"""create a set of tuples representing column/string pairs for use
in an INSERT or UPDATE statement.
@@ -61,15 +63,22 @@ def _get_crud_params(compiler, stmt, keep_order=False, **kw):
_column_as_key, _getattr_col_key, _col_bind_name = \
_key_getters_for_crud_column(compiler)
+ # We have to keep parameters' order if we are doing an update and the
+ # statement paramenters are a list or tuple of pairs. It would also work
+ # without isupdate check, but adding it shortcircuits the boolean operation
+ # resulting in false for all inserts.
+ keep_order = (compiler.isupdate
+ and sql_util.is_value_pair_dict(stmt.parameters))
+ dict_type = util.OrderedDict if keep_order else dict
# if we have statement parameters - set defaults in the
# compiled params
if compiler.column_keys is None:
- parameters = util.OrderedDict()
+ parameters = dict_type()
else:
- parameters = util.OrderedDict((_column_as_key(key), REQUIRED)
- for key in compiler.column_keys
- if not stmt_parameters or
- key not in stmt_parameters)
+ parameters = dict_type((_column_as_key(key), REQUIRED)
+ for key in compiler.column_keys
+ if not stmt_parameters or
+ key not in stmt_parameters)
# create a list of column assignment clauses as tuples
values = []