Actualización de una tabla de otra tabla con varias columnas en sqlalchemy

Quiero actualizar varias columnas de una tabla de acuerdo con otras columnas múltiples de otra tabla en SQLAlchemy. Estoy usando SQLite al probarlo, así que no puedo usar la syntax `UPDATE table1 SET col = val WHERE table1.key == table2.key”.

En otras palabras, estoy tratando de crear este tipo de consulta de actualización:

UPDATE table1 SET col1 = (SELECT col1 FROM table2 WHERE table2.key == table1.key), col2 = (SELECT col2 FROM table2 WHERE table2.key == table1.key) 

En 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)) 

Solo me gustaría hacer la consulta solo una vez en lugar de dos, a menos que SQLite y MySQL sean lo suficientemente inteligentes como para no hacer esa consulta dos veces.

No creo que puedas. Por lo tanto, esto no es realmente una respuesta, pero es demasiado largo para un comentario.

Puede componer fácilmente su consulta con 2 columnas (supongo que ya lo sabía):

 select_query = select([table2.c.col1, table2.c.col2]).where(table1.c.key == table2.c.key) 

y luego puede usar el método with_only_columns() , vea 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) 

Pero como se ve en la statement de actualización, estará haciendo dos selecciones de manera efectiva. (Lo siento, no adapté completamente la salida a su ejemplo, pero estoy seguro de que se le ocurre la idea).

No estoy seguro de si, como usted dice, MySQL será lo suficientemente inteligente como para que sea solo una consulta. Supongo que sí. Espero que ayude de todos modos.