在 sqlalchemy 中使用多个列从另一个 table 更新一个 table
Updating a table from another table with multiple columns in sqlalchemy
我想根据 SQLAlchemy 中另一个 table 的其他多个列更新一个 table 的多个列。我在测试它时使用 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 足够聪明,不会自己进行两次查询。
我认为你做不到。因此,这不是一个真正的答案,但对于评论来说太长了。
您可以轻松地用 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
是否像您所说的那样足够聪明,可以只进行一次查询。大概吧。希望它能有所帮助。
我想根据 SQLAlchemy 中另一个 table 的其他多个列更新一个 table 的多个列。我在测试它时使用 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 足够聪明,不会自己进行两次查询。
我认为你做不到。因此,这不是一个真正的答案,但对于评论来说太长了。
您可以轻松地用 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
是否像您所说的那样足够聪明,可以只进行一次查询。大概吧。希望它能有所帮助。