在sqlalchemy中使用多列更新另一个表中的表

时间:2015-05-12 08:01:58

标签: python mysql sqlite sqlalchemy

我想根据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足够聪明,不能自己进行两次查询,否则我只想进行一次而不是两次查询。

1 个答案:

答案 0 :(得分: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是否足够智能,只能使其成为一个查询。大概吧。希望它无论如何都有帮助。