SqlAlchemy Left Присоединиться с графом - PullRequest
9 голосов
/ 28 февраля 2012
class Employee
    id
    name

class Location
    id
    city

class Work
    id
    employee_id
    location_id

Todo: соединение слева с количеством (включая ноль)

Желаемый результат

    location.city count
    NYC 10
    SFO 5
    CHI 0

Необработанный запрос:

    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). \

Как правильно указать столбцы в select при выполнении левого соединения?

1 Ответ

8 голосов
/ 28 февраля 2012

Определите отношения между вашими таблицами при определении модели orm.См. этот урок .В вашем примере Work является таблицей ассоциации, поэтому, если у вас нет других данных в Work, вы можете использовать отношение многие ко многим например:

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')

Затем запрос:

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

Поскольку вы определили отношение, sqlalchemy будет знать направление и столбцы для outerjoin.

Когда вы делаете group_by, важно передать Location, а не просто Location.id, потому что, выполнив select(Location), sqlalchemy выберет все столбцы в Location, и поэтому вы также должны передатьвсе столбцы в местоположении.

...