'Perform a bulk update query.
Updates rows matched by this query in the database.
:param values: a dictionary with attributes names as keys and literal
values or sql expressions as values.
:param synchronize_session: chooses the strategy to update the
attributes on objects in the session. Valid values are:
``False`` - don\'t synchronize the session. This option is the most
efficient and is reliable once the session is expired, which
typically occurs after a commit(), or explicitly using
expire_all(). Before the expiration, updated objects may still
remain in the session with stale values on their attributes, which
can lead to confusing results.
``\'fetch\'`` - performs a select query before the update to find
objects that are matched by the update query. The updated
attributes are expired on matched objects.
``\'evaluate\'`` - Evaluate the Query\'s criteria in Python straight
on the objects in the session. If evaluation of the criteria isn\'t
implemented, an exception is raised.
The expression evaluator currently doesn\'t account for differing
string collations between the database and Python.
:return: the count of rows matched as returned by the database\'s
"row count" feature.
This method has several key caveats:
* The method does **not** offer in-Python cascading of relationships - it
is assumed that ON UPDATE CASCADE is configured for any foreign key
references which require it, otherwise the database may emit an
integrity violation if foreign key references are being enforced.
After the UPDATE, dependent objects in the :class:`.Session` which
were impacted by an ON UPDATE CASCADE may not contain the current
state; this issue is resolved once the :class:`.Session` is expired,
which normally occurs upon :meth:`.Session.commit` or can be forced
by using :meth:`.Session.expire_all`.
* As of 0.8, this method will support multiple table updates, as detailed
in :ref:`multi_table_updates`, and this behavior does extend to support
updates of joined-inheritance and other multiple table mappings.  However,
the **join condition of an inheritance mapper is currently not
automatically rendered**.
Care must be taken in any multiple-table update to explicitly include
the joining condition between those tables, even in mappings where
this is normally automatic.
E.g. if a class ``Engineer`` subclasses ``Employee``, an UPDATE of the
``Engineer`` local table using criteria against the ``Employee``
local table might look like::
session.query(Engineer).\
filter(Engineer.id == Employee.id).\
filter(Employee.name == \'dilbert\').\
update({"engineer_type": "programmer"})
* The :meth:`.MapperEvents.before_update` and
:meth:`.MapperEvents.after_update`
events are **not** invoked from this method.  Instead, the
:meth:`.SessionEvents.after_bulk_update` method is provided to act
upon a mass UPDATE of entity rows.
.. seealso::
:meth:`.Query.delete`
:ref:`inserts_and_updates` - Core SQL tutorial'

def update(self, values, synchronize_session='evaluate'):

    update_op = persistence.BulkUpdate.factory(self, synchronize_session, values)
    update_op.exec_()
    return update_op.rowcount
