簡體   English   中英

SqlAlchemy Left加入計數

[英]SqlAlchemy Left Join with count

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中指定列的正確方法是什么?

定義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中的所有列,因此您還必須傳遞Location中的所有列。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM