SQLAlchemy关联多列的更新

amc*_*ley 8 python postgresql sqlalchemy

我已经能够使用此处文档中显示的相关更新构造来更新表中的一列.

例如:

sel = select([UpdateTable.column]).\
      where(UpdateTable.id == OrigTable.id)

up = update(OrigTable).values(column=sel) 
Run Code Online (Sandbox Code Playgroud)

哪个产生SQL如:

UPDATE origtable SET column=(SELECT updatetable.column
FROM updatetable
WHERE updatetable.id = origtable.id)
Run Code Online (Sandbox Code Playgroud)

是否可以使用Declaritive或Query Api更新选择的多个列?

我试图在PostgreSQL中模拟类似下面的内容:

UPDATE origtable
   SET
     column1 = updatetable.column1,
     column2 = updatetable.column2
   FROM updatetable 
   WHERE origtable.id == updatetable.id
Run Code Online (Sandbox Code Playgroud)

编辑:

似乎使用当前的SQLAlchemy api可能无法将此单个语句格式化.

但是,使用此处的解决方案似乎可以使用两个选择.

Ilj*_*ilä 5

由于这是针对 Postgresql,我们可以使用 SQLAlchemy 的多表更新支持。该文档仅适用于 Core,但Query API构建在 Core 之上,我们可以应用该知识

session.query(OrigTable).\
    filter(OrigTable.id == UpdateTable.id).\
    update({OrigTable.column1: UpdateTable.column1,
            OrigTable.column2: UpdateTable.column2},
           synchronize_session=False)
Run Code Online (Sandbox Code Playgroud)

这导致

UPDATE origtable
SET column1=updatetable.column1,
    column2=updatetable.column2
FROM updatetable
WHERE origtable.id = updatetable.id
Run Code Online (Sandbox Code Playgroud)