【问题标题】:SQLAlchemy correlated update for multiple columns多列的 SQLAlchemy 相关更新
【发布时间】:2015-12-04 15:12:01
【问题描述】:

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

例如:

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

up = update(OrigTable).values(column=sel) 

产生如下 SQL:

UPDATE origtable SET column=(SELECT updatetable.column
FROM updatetable
WHERE updatetable.id = origtable.id)

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

我正在尝试在 PostgreSQL 中模拟以下内容:

UPDATE origtable
   SET
     column1 = updatetable.column1,
     column2 = updatetable.column2
   FROM updatetable 
   WHERE origtable.id == updatetable.id

编辑:

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

但是,使用 here 的解决方案似乎可以使用两个选择的解决方法。

【问题讨论】:

  • This solution 不是最佳选择,但可能已经足够满足您的需要。
  • 谢谢@lrnzcig,我认为这样的事情是可能的。我猜目前的api不直接支持这个。
  • 不客气。 (如果有帮助,我可以建议为链接的解决方案 +1。谢谢。)
  • @lrnzcig。完成,再次感谢。

标签: python postgresql sqlalchemy


【解决方案1】:

由于这是针对 Postgresql 的,我们可以使用 SQLAlchemy 的 multiple table update 支持。该文档仅适用于 Core,但 Query API 构建在 Core 之上,我们可以 apply that knowledge

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

导致

UPDATE origtable
SET column1=updatetable.column1,
    column2=updatetable.column2
FROM updatetable
WHERE origtable.id = updatetable.id

【讨论】:

    猜你喜欢
    • 2017-07-25
    • 2016-06-18
    • 2013-10-14
    • 1970-01-01
    • 2019-10-16
    • 1970-01-01
    • 1970-01-01
    • 2020-10-13
    • 2021-07-10
    相关资源
    最近更新 更多