Sqlalchemy 简明教程

Parameter-Ordered Updates

原始 SQL 的 UPDATE 查询具有 SET 子句。它由 Update.values() 构造使用原始表对象中给出的列顺序渲染。因此,具有特定列的特定 UPDATE 语句每次都会被渲染相同。由于参数本身作为 Python 词典键传递给 Update.values() 方法,因此没有其他固定的排序可用。

在某些情况下,SET 子句中呈现的参数顺序很重要。在 MySQL 中,提供列值更新是基于其他列值的更新。

以下语句的结果:

UPDATE table1 SET x = y + 10, y = 20

将具有与以下不同的结果:

UPDATE table1 SET y = 20, x = y + 10

MySQL 中的 SET 子句以按值方式进行评估,而不是以按行方式进行评估。为此,使用了 preserve_parameter_order 。Python 2 元组列表作为 Update.values() 方法的参数给出:

stmt = table1.update(preserve_parameter_order = True).\
   values([(table1.c.y, 20), (table1.c.x, table1.c.y + 10)])

列表对象类似于词典,除了它是按顺序排列的。这确保了 “y” 列的 SET 子句将首先渲染,然后是 “x” 列的 SET 子句。