2012-02-28 17 views
8
class Employee 
    id 
    name 

class Location 
    id 
    city 

class Work 
    id 
    employee_id 
    location_id 

Todo: LEFT JOIN z liczby (w tym zero)sqlalchemy LEFT JOIN z liczbą

pożądanego rezultatu

location.city count 
    NYC 10 
    SFO 5 
    CHI 0 

Raw zapytanie:

select location.id, count(work.id) as count 
    from location 
    left join work 
    on location.id = work.location_id 
    group by location.id 

sqlalchemy:

db_session.query(Location, func.count.work_id).label('count')). \ 
       filter(location.id == work.location_id). \ 
       group_by(location._id). \ 

Jaki jest właściwy sposób określania kolumn w select podczas wykonywania lewostronnego łączenia?

Odpowiedz

7

Definiowanie relacji między tabelami podczas definiowania modelu orm. Zobacz this tutorial. W przykładzie Work jest stół stowarzyszenie, więc jeśli nie masz żadnych innych danych w Work, można użyć many to many relationship np

from sqlalchemy.orm import relationship 

class Work 
    id 
    employee_id 
    location_id 

class Employee 
    id 
    name 

class Location 
    id 
    city 
    employees = relationship(Employee, secondary=Work, backref='locations') 

Następnie zapytania:

session.query(Location, func.count(Work.id)).outerjoin(Work).group_by(Location) 

Jak masz zdefiniowany związek, sqlalchemy będzie znać kierunek i kolumny dla outerjoin.

Po wykonaniu group_by, ważne jest, aby zdać Location i nie tylko Location.id, ponieważ wykonując select(Location), SQLAlchemy będzie zaznaczyć wszystkie kolumny w miejscu, a więc należy również przekazać wszystkie kolumny w gości.