Od wersji 0.7.4 sqlalchemy.sql.expression.update umożliwia odwoływanie się do wielu tabel w klauzuli WHERE. Dzięki temu możesz zbudować i wykonać wyrażenie takie jak:
users.update().values(name='ed').where(
users.c.name==select([addresses.c.email_address]).\
where(addresses.c.user_id==users.c.id).\
as_scalar()
)
(przykład prosto z powyższego linku)
Problem ValAyal polega na tym, że Query.join()
nie jest obsługiwany przez Query.update()
. Niestety, do wersji 0.9.1 generowało to po cichu zapytania, takie jak to, które ValAyal udostępnił powyżej. notatki dziennika zmian dla wersji 0.9.1
zauważa, że zachowanie zostało zmodyfikowane w celu wyświetlenia ostrzeżenia:
Właściwie natknęliśmy się na to, gdzie pracuję dziś wieczorem i okazało się, że nasz kod w rzeczywistości emituje następujące ostrzeżenie (które mówi, że będzie to błąd w wersji 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()
W naszym przypadku zdecydowaliśmy się przekonwertować aktualizację na wybór i aktualizację na jedną tabelę.