【问题标题】:Updating a table from another table with multiple columns in sqlalchemy在 sqlalchemy 中从具有多列的另一个表更新表
【发布时间】:2015-05-13 18:17:35
【问题描述】:

我想根据 SQLAlchemy 中另一张表的其他多列更新一个表的多列。我在测试时使用的是 SQLite,所以我不能使用 `UPDATE table1 SET col=val WHERE table1.key == table2.key" 语法。

换句话说,我正在尝试创建这种更新查询:

UPDATE table1 
SET 
   col1 = (SELECT col1 FROM table2 WHERE table2.key == table1.key), 
   col2 = (SELECT col2 FROM table2 WHERE table2.key == table1.key)

在 SQLAlchemy 中:

select_query1 = select([table2.c.col1]).where(table1.c.key == table2.c.key)
select_query2 = select([table2.c.col2]).where(table1.c.key == table2.c.key)
session.execute(table.update().values(col1=select_query1, col2=select_query2))

我只想查询一次而不是两次,除非 SQLite 和 MySQL 足够聪明,不会自己进行两次查询。

【问题讨论】:

标签: python mysql sqlite sqlalchemy


【解决方案1】:

我不认为你可以。因此,这不是一个真正的答案,但评论太长了。

您可以轻松地用 2 列组合查询(我想您已经知道了):

select_query = select([table2.c.col1, table2.c.col2]).where(table1.c.key == table2.c.key)

之后可以使用with_only_columns()的方法,见api

In[52]: print(table.update().values(col1 = select_query.with_only_columns([table2.c.col1]), col2 = select_query.with_only_columns([table2.c.col2])))
UPDATE table SET a=(SELECT tweet.id 
FROM tweet 
WHERE tweet.id IS NOT NULL), b=(SELECT tweet.user_id 
FROM tweet 
WHERE tweet.id IS NOT NULL)

但正如您从更新语句中看到的那样,您将有效地进行两次选择。 (抱歉,我没有将输出完全适应您的示例,但我相信您明白了)。

我不确定,正如你所说,MySQL 是否足够聪明,可以只进行一次查询。大概吧。无论如何,希望它有所帮助。

【讨论】:

  • 这有助于确保我没有更好的选择 :) 当我使用 SQLite 和 MySQL 的 UPDATE FROM 查询时,我最终这样做了(使用 select 的查询在 MySQL 中不起作用,因为它来自临时表,您不能在一个查询中使用两次临时表)。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-10-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-05-19
  • 1970-01-01
相关资源
最近更新 更多