diff options
| author | Mike Bayer <mike_mp@zzzcomputing.com> | 2015-11-28 14:30:05 -0500 |
|---|---|---|
| committer | Mike Bayer <mike_mp@zzzcomputing.com> | 2015-11-28 14:30:05 -0500 |
| commit | c90f0a49f332867f6b337c79ddf192299788667f (patch) | |
| tree | b806df31d3cef0fa1510bea6a46d76c0b72cf4f5 /lib/sqlalchemy/orm | |
| parent | 1202e140b9876cf202c56d2f41bbbb573e15a39d (diff) | |
| download | sqlalchemy-c90f0a49f332867f6b337c79ddf192299788667f.tar.gz | |
- Added support for parameter-ordered SET clauses in an UPDATE
statement. This feature is available by passing the
:paramref:`~.sqlalchemy.sql.expression.update.preserve_parameter_order`
flag either to the core :class:`.Update` construct or alternatively
adding it to the :paramref:`.Query.update.update_args` dictionary at
the ORM-level, also passing the parameters themselves as a list of 2-tuples.
Thanks to Gorka Eguileor for implementation and tests.
adapted from pullreq github:200
Diffstat (limited to 'lib/sqlalchemy/orm')
| -rw-r--r-- | lib/sqlalchemy/orm/persistence.py | 16 | ||||
| -rw-r--r-- | lib/sqlalchemy/orm/query.py | 10 |
2 files changed, 20 insertions, 6 deletions
diff --git a/lib/sqlalchemy/orm/persistence.py b/lib/sqlalchemy/orm/persistence.py index 1f9d0a235..768c1146a 100644 --- a/lib/sqlalchemy/orm/persistence.py +++ b/lib/sqlalchemy/orm/persistence.py @@ -1258,10 +1258,16 @@ class BulkUpdate(BulkUD): "Invalid expression type: %r" % key) def _do_exec(self): - values = dict( + + values = [ (self._resolve_string_to_expr(k), v) - for k, v in self.values.items() - ) + for k, v in ( + self.values.items() if hasattr(self.values, 'items') + else self.values) + ] + if not self.update_kwargs.get('preserve_parameter_order', False): + values = dict(values) + update_stmt = sql.update(self.primary_table, self.context.whereclause, values, **self.update_kwargs) @@ -1311,7 +1317,9 @@ class BulkUpdateEvaluate(BulkEvaluate, BulkUpdate): def _additional_evaluators(self, evaluator_compiler): self.value_evaluators = {} - for key, value in self.values.items(): + values = (self.values.items() if hasattr(self.values, 'items') + else self.values) + for key, value in values: key = self._resolve_key_to_attrname(key) if key is not None: self.value_evaluators[key] = evaluator_compiler.process( diff --git a/lib/sqlalchemy/orm/query.py b/lib/sqlalchemy/orm/query.py index 84fb04d80..4441975bf 100644 --- a/lib/sqlalchemy/orm/query.py +++ b/lib/sqlalchemy/orm/query.py @@ -2910,7 +2910,12 @@ class Query(object): :param values: a dictionary with attributes names, or alternatively mapped attributes or SQL expressions, as keys, and literal - values or sql expressions as values. + values or sql expressions as values. If :ref:`parameter-ordered + mode <updates_order_parameters>` is desired, the values can be + passed as a list of 2-tuples; + this requires that the :paramref:`~sqlalchemy.sql.expression.update.preserve_parameter_order` + flag is passed to the :paramref:`.Query.update.update_args` dictionary + as well. .. versionchanged:: 1.0.0 - string names in the values dictionary are now resolved against the mapped entity; previously, these @@ -2941,7 +2946,8 @@ class Query(object): :param update_args: Optional dictionary, if present will be passed to the underlying :func:`.update` construct as the ``**kw`` for the object. May be used to pass dialect-specific arguments such - as ``mysql_limit``. + as ``mysql_limit``, as well as other special arguments such as + :paramref:`~sqlalchemy.sql.expression.update.preserve_parameter_order`. .. versionadded:: 1.0.0 |
