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

class Location 
    id 
    city 

class Work 
    id 
    employee_id 
    location_id 

Todo: Выравнивание по левому краю со счетом (включая ноль)SQLAlchemy Соединение слева со счетом

желаемому результату

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

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

ответ

7

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

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 будет выбрать все столбцы в местоположение, и поэтому вы должны также пройти все столбцы Местоположение.

Смежные вопросы