【问题标题】:SqlAlchemy Left Join with countSqlAlchemy 左连接计数
【发布时间】:2012-02-28 07:22:30
【问题描述】:
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). \

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

【问题讨论】:

    标签: python count sqlalchemy left-join


    【解决方案1】:

    在定义 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 将选择 Location 中的所有列,因此您还必须传递所有列位置。

    【讨论】:

      猜你喜欢
      • 2019-05-19
      • 2011-01-14
      • 2014-08-08
      • 2015-05-31
      • 1970-01-01
      • 1970-01-01
      • 2018-10-26
      • 2011-06-05
      • 1970-01-01
      相关资源
      最近更新 更多