2012-02-28 41 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). \ 

在进行左连接时,在select中指定列的正确方法是什么?

回答

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的将地点选择所有列是很重要的,所以你也必须通过在位置的所有列。