Od verze 0.7.4 sqlalchemy.sql.expression.update umožňuje odkazovat na více tabulek v klauzuli WHERE. S tímto můžete vytvořit a spustit výraz jako:
users.update().values(name='ed').where(
users.c.name==select([addresses.c.email_address]).\
where(addresses.c.user_id==users.c.id).\
as_scalar()
)
(příklad přímo z odkazu výše)
Problém, který má ValAyal, je ve skutečnosti proto, že Query.join()
není podporován s Query.update()
. Bohužel až do 0.9.1 to tiše generovalo dotazy podobné těm, které ValAyal sdílel výše. poznámky k protokolu změn pro 0.9.1
poznamenává, že chování bylo upraveno tak, aby vydávalo varování:
Ve skutečnosti jsme na to narazili, když jsem dnes večer pracoval, a zjistili jsme, že náš kód ve skutečnosti vydává následující varování (které říká, že jde o chybu v 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()
V našem případě jsme se rozhodli převést aktualizaci na výběr a aktualizaci na jednu tabulku.