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

class Location 
    id 
    city 

class Work 
    id 
    employee_id 
    location_id 

藤堂に参加:SQLAlchemyの左のカウント

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). \ 
左(ゼロを含む)のカウントで

望ましい結果

location.city count 
    NYC 10 
    SFO 5 
    CHI 0 

生のクエリに参加

left joinを実行しているときに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を行うとselect(Location)を行うことで、SQLAlchemyの場所ですべての列を選択し、そうあなたも場所内のすべての列を渡す必要がありますので、LocationだけでなくLocation.idを渡すことが重要です。