A partire dalla versione 0.7.4 sqlalchemy.sql.expression.update ti consente di fare riferimento a più tabelle nella clausola WHERE. Con questo, puoi costruire ed eseguire un'espressione come:
users.update().values(name='ed').where(
users.c.name==select([addresses.c.email_address]).\
where(addresses.c.user_id==users.c.id).\
as_scalar()
)
(esempio direttamente dal link sopra)
Il problema che ValAyal sta avendo è in realtà perché Query.join()
non è supportato con Query.update()
. Sfortunatamente, fino alla 0.9.1 questo generava silenziosamente query come quella condivisa da ValAyal sopra. Le note del registro delle modifiche per 0.9.1
rileva che il comportamento è stato modificato per emettere un avviso:
In realtà ci siamo imbattuti in questo dove lavoro proprio questa sera e ho scoperto che il nostro codice sta, in effetti, emettendo il seguente avviso (che dice che sarà un errore in 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()
Nel nostro caso, abbiamo deciso di convertire l'aggiornamento in una selezione e un aggiornamento in una tabella.