Från och med version 0.7.4 sqlalchemy.sql.expression.update tillåter dig att referera till flera tabeller i WHERE-satsen. Med detta kan du bygga och exekvera ett uttryck som:
users.update().values(name='ed').where(
users.c.name==select([addresses.c.email_address]).\
where(addresses.c.user_id==users.c.id).\
as_scalar()
)
(exempel direkt från länken ovan)
Problemet som ValAyal har beror faktiskt på att Query.join()
stöds inte med Query.update()
. Tyvärr, fram till 0.9.1 genererade detta tyst frågor som den ValAyal delade ovan. ändringslogganteckningarna för 0.9.1
noterar att beteendet modifierades för att avge en varning:
Vi stötte faktiskt på det här där jag jobbar just i kväll och upptäckte att vår kod faktiskt avger följande varning (som säger att det kommer ett fel i 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()
I vårt fall valde vi att konvertera uppdateringen till ett urval och en uppdatering till en tabell.