diff options
Diffstat (limited to 'lib/sqlalchemy')
| -rw-r--r-- | lib/sqlalchemy/orm/persistence.py | 12 | ||||
| -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 |
4 files changed, 15 insertions, 18 deletions
diff --git a/lib/sqlalchemy/orm/persistence.py b/lib/sqlalchemy/orm/persistence.py index 373bd93fb..0a6ac98f6 100644 --- a/lib/sqlalchemy/orm/persistence.py +++ b/lib/sqlalchemy/orm/persistence.py @@ -1259,16 +1259,12 @@ class BulkUpdate(BulkUD): def _do_exec(self): if isinstance(self.values, (list, tuple)): - dict_type = util.OrderedDict - values = self.values + values = tuple((self._resolve_string_to_expr(k), v) + for k, v in self.values) else: - dict_type = dict - values = self.values.items() + values = {self._resolve_string_to_expr(k): v + for k, v in self.values.items()} - values = dict_type( - (self._resolve_string_to_expr(k), v) - for k, v in values - ) update_stmt = sql.update(self.primary_table, self.context.whereclause, values, **self.update_kwargs) 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)) |
