sqlalchemy, (outer) join i onclause
Czasem zdarza się że za pomocą sqlalchemy chcemy zrobić coś dziwnego np. stworzyć outerjoin definiując własną klauzulę ON.
Jeśli trafiłeś tutaj szukając sposobu jak rozwiązać błąd:
TypeError: unknown arguments: onclaus
to dobrze trafiłeś :)
Załóżmy że User i Adrress to nasze obiekty, a t_user i t_adress to definicje naszych table.
meta.Session.query(User).outerjoin(Adrress, onclause=t_user.c.id==t.adress.c.user).all() |
Zapytanie zaprezentowane powyżej zwróci nam wspomniany już wyjątek. Aby zrobić to „dobrze”, powyższy outerjoin, należy zmodyfikować do takiej postaci:
meta.Session.query(User).outerjoin((Adrress, t_user.c.id==t.adress.c.user)).all() |
Jeśli chcemy rozszerzyć klauzulę ON o jakiś dodatkowy warunek wystarczy zrobić tak:
from sqlalchemy import and_ meta.Session.query(User).outerjoin((Adrress, and_(t_user.c.id==t.adress.c.user, t.adress.c.home==True)).all() |
Zapewne dla niektórych jest to oczywiste, ale dla mnie na samym początku nie było
Preview: