Sqlalchemy-core-parameterordered-updates

提供:Dev Guides
移動先:案内検索

パラメータ順の更新

生SQLのUPDATEクエリにはSET句があります。 元のTableオブジェクトで指定された列の順序を使用するupdate()コンストラクトによってレンダリングされます。 したがって、特定の列を持つ特定の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 が使用されます。 2タプルのPythonリストは* Update.values()*メソッドへの引数として与えられます-

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

Listオブジェクトは辞書に似ていますが、順序付けられている点が異なります。 これにより、「y」列のSET句が最初にレンダリングされ、次に「x」列のSET句がレンダリングされます。