diff options
author | Gorka Eguileor <geguileo@redhat.com> | 2015-09-29 20:29:33 +0200 |
---|---|---|
committer | Gorka Eguileor <geguileo@redhat.com> | 2015-09-29 20:29:33 +0200 |
commit | 9fb76d759678558f6fd087dcc04de3f2daa3a571 (patch) | |
tree | 4d4155a79fe49d3f97e5e734acaf20b83684d9fd /lib/sqlalchemy/sql/crud.py | |
parent | fc73036865a0c0d2809b66fcfdc663ff425f4267 (diff) | |
download | sqlalchemy-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.py | 21 |
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 = [] |