Python 在sqlalchemy中从另一个具有多个列的表更新表

Python 在sqlalchemy中从另一个具有多个列的表更新表,python,mysql,sqlite,sqlalchemy,Python,Mysql,Sqlite,Sqlalchemy,我想根据SQLAlchemy中另一个表的其他多列更新一个表的多列。我在测试它时使用的是SQLite,所以我不能使用“updatetable1 SET col=val WHERE table1.key==table2.key”语法 换句话说,我正在尝试创建这种更新查询: UPDATE table1 SET col1 = (SELECT col1 FROM table2 WHERE table2.key == table1.key), col2 = (SELECT col2 FRO

我想根据SQLAlchemy中另一个表的其他多列更新一个表的多列。我在测试它时使用的是SQLite,所以我不能使用“updatetable1 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)
在炼金术中:

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足够聪明,不会自己进行两次查询。

我认为你不能。因此,这不是一个真正的答案,但它太长了,无法发表评论

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

之后,您可以将方法
与_only_columns()一起使用,请参见:

但是,正如您从update语句中看到的,您将有效地进行两个选择(很抱歉,我没有将输出完全适应您的示例,但我相信您已经明白了)


我不确定,正如你所说,
MySQL
是否足够聪明,可以只进行一次查询。我想是的。希望它能有所帮助。

这有助于确保我没有更好的选择:)我在使用SQLite和MySQL的“更新自查询”时做到了这一点(使用select的查询在MySQL中不起作用,因为它来自临时表,并且不能在一个查询中使用临时表两次)。
select_query = select([table2.c.col1, table2.c.col2]).where(table1.c.key == table2.c.key)
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)