diff options
| author | Gorka Eguileor <geguileo@redhat.com> | 2015-09-30 18:45:05 +0200 |
|---|---|---|
| committer | Gorka Eguileor <geguileo@redhat.com> | 2015-09-30 18:45:05 +0200 |
| commit | ddb43cebf68b9e6194a1a22b7630e143d2a79c00 (patch) | |
| tree | ccaca42d05eeed19288a33bd7eceb6c4e5db2d49 /lib/sqlalchemy/sql | |
| parent | 9fb76d759678558f6fd087dcc04de3f2daa3a571 (diff) | |
| download | sqlalchemy-ddb43cebf68b9e6194a1a22b7630e143d2a79c00.tar.gz | |
Postpone parameters change in ordered updates
Postpone as much as possible the change of update parameters to
OrderedDict from list or tuple of pairs.
This way we won't have problems with query's update method.
Diffstat (limited to 'lib/sqlalchemy/sql')
| -rw-r--r-- | lib/sqlalchemy/sql/crud.py | 9 | ||||
| -rw-r--r-- | lib/sqlalchemy/sql/dml.py | 10 | ||||
| -rw-r--r-- | lib/sqlalchemy/sql/util.py | 2 |
3 files changed, 11 insertions, 10 deletions
diff --git a/lib/sqlalchemy/sql/crud.py b/lib/sqlalchemy/sql/crud.py index 235889ad9..0ab52a13e 100644 --- a/lib/sqlalchemy/sql/crud.py +++ b/lib/sqlalchemy/sql/crud.py @@ -68,8 +68,13 @@ def _get_crud_params(compiler, stmt, **kw): # 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 + and sql_util.is_value_pair_dict(stmt_parameters)) + if keep_order: + stmt_parameters = util.OrderedDict(stmt_parameters) + dict_type = util.OrderedDict + else: + dict_type = dict + # if we have statement parameters - set defaults in the # compiled params if compiler.column_keys is None: diff --git a/lib/sqlalchemy/sql/dml.py b/lib/sqlalchemy/sql/dml.py index c8407e3fd..dead61d9a 100644 --- a/lib/sqlalchemy/sql/dml.py +++ b/lib/sqlalchemy/sql/dml.py @@ -32,13 +32,9 @@ class UpdateBase(DialectKWArgs, HasPrefixes, Executable, ClauseElement): def _process_colparams(self, parameters): def process_single(p): - if isinstance(p, (list, tuple)): - if sql_util.is_value_pair_dict(p): - return util.OrderedDict(p) - return dict( - (c.key, pval) - for c, pval in zip(self.table.c, p) - ) + if (isinstance(p, (list, tuple)) and + not sql_util.is_value_pair_dict(p)): + return {c.key: pval for c, pval in zip(self.table.c, p)} else: return p diff --git a/lib/sqlalchemy/sql/util.py b/lib/sqlalchemy/sql/util.py index c73f710af..dedbdfe32 100644 --- a/lib/sqlalchemy/sql/util.py +++ b/lib/sqlalchemy/sql/util.py @@ -439,7 +439,7 @@ def criterion_as_pairs(expression, consider_as_foreign_keys=None, def is_value_pair_dict(params): """Check if params is a value list/tuple representing a dictionary.""" - return (isinstance(params, (list, tuple)) and + return (isinstance(params, (list, tuple)) and len(params) > 0 and all(isinstance(p, (list, tuple)) and len(p) == 2 and isinstance(p[0], schema.Column) for p in params)) |
