A partir da versão 0.7.4 sqlalchemy.sql.expression.update permite que você faça referência a várias tabelas na cláusula WHERE. Com isso, você pode construir e executar uma expressão como:
users.update().values(name='ed').where(
users.c.name==select([addresses.c.email_address]).\
where(addresses.c.user_id==users.c.id).\
as_scalar()
)
(exemplo direto do link acima)
O problema que ValAyal está tendo é porque
Query.join()
não é suportado com Query.update()
. Infelizmente, até 0.9.1 isso gerava silenciosamente consultas como a que ValAyal compartilhou acima. As notas do changelog para 0.9.1
observa que o comportamento foi modificado para emitir um aviso:Na verdade, nos deparamos com isso onde eu trabalho esta noite e descobrimos que nosso código está, de fato, emitindo o seguinte aviso (que diz que haverá um erro em 1.0):
SAWarning: Can't call Query.update() or Query.delete() when join(), outerjoin(), select_from(), or from_self() has been called. This will be an exception in 1.0
self._validate_query_state()
No nosso caso, optamos por converter a atualização em um select e uma atualização em uma tabela.