我想根据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足够聪明,不能自己进行两次查询,否则我只想进行一次而不是两次查询。
答案 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
是否足够智能,只能使其成为一个查询。大概吧。希望它无论如何都有帮助。