2015-05-12 159 views
2

我想根據SQLAlchemy中另一個表的其他多列更新一個表的多個列。我在測試時使用SQLite,所以我不能使用`UPDATE table1 SET col = val WHERE table1.key == table2.key「語法。從sqlalchemy中的多列更新另一個表的表格

換句話說,我試圖創建這個排序更新詢問:

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

http://stackoverflow.com/questions/42613777/sqlalchemy-correlated-update-with-multiplecolumns –

回答

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將足夠聰明,使其只有一個查詢。我猜是這樣。無論如何希望它有幫助。

+0

它有助於確保我沒有更好的選擇:)我最終這樣做時,使用SQLite和UPDATE FROM使用MySQL進行查詢(使用select的查詢在MySQL中不起作用,因爲它來自臨時表,並且在一個查詢中不能使用臨時表兩次)。 – KimiNewt

+0

http://stackoverflow.com/questions/42613777/sqlalchemy-correlated-update-with-multiple-columns –

相關問題