【问题标题】:SQL statement to sqlalchemy ORM query APISQL 语句到 sqlalchemy ORM 查询 API
【发布时间】:2020-09-19 23:29:44
【问题描述】:

我有以下 SQL 语句按预期工作,但我想使用 sqlalchemy 的查询 API 做同样的事情,我尝试了以下但它返回空。知道如何通过编写查询 API 操作来获取此 SQL 语句吗?

原始 SQL 语句为:

SELECT COUNT(mid), mname
FROM(
    SELECT missions._id AS mid, missions.name AS mname
    FROM missions
    INNER JOIN mission_ownership
    ON missions._id = mission_ownership.mission_id
    INNER JOIN mission_agencies
    ON mission_agencies._id = mission_ownership.mission_agency_id
    WHERE mission_agencies.name = 'Nasa'
    )
GROUP BY mid
HAVING COUNT(mid) > 1

我目前使用 ORM 查询 API 的内容:

nasa_and_esa_missions = session.query(func.count(Mission._id), Mission).\
    join(mission_ownership). \
    join(MissionAgency).\
    filter(MissionAgency.name == 'Nasa').\
    group_by(Mission._id).\
    having(func.count(Mission._id) > 1)

【问题讨论】:

    标签: python sql sqlalchemy


    【解决方案1】:

    如果mission_ownershipmission_agency在ORM级别之间没有配置关系,这可以通过将内部SELECT建模为subquery来完成:

    subq = (session.query(Mission._id.label('mid'), Mission.name.label('mname'))
                   .join(mission_ownership)
                   .join(MissionAgency)
                   .filter(MissionAgency.name == 'Nasa')
                   .subquery())
    
    q = (session.query(subq.c.mid, Mission)
                .group_by(subq.c.mid)
                .having(sa.func.count(subq.c.mid) > 1)) 
    
    
    
    for id_, m in q:
        print(id_, m.name)
    

    生成此 SQL:

    SELECT anon_1.mid AS anon_1_mid, missions._id AS missions__id, missions.name AS missions_name 
    FROM (SELECT missions._id AS mid, missions.name AS mname FROM missions 
      JOIN mission_ownership ON missions._id = mission_ownership.mission_id 
      JOIN mission_agencies ON mission_agencies._id = mission_ownership.mission_agency_id 
      WHERE mission_agencies.name = ?) AS anon_1, missions 
    GROUP BY anon_1.mid 
    HAVING count(anon_1.mid) > ?
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2017-02-01
      • 2021-05-09
      • 2017-04-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多