繁体   English   中英

SQL语句转sqlalchemy ORM查询API

[英]SQL statement to sqlalchemy ORM query API

我有以下按预期工作的 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)

如果在 ORM 级别未配置mission_ownershipmission_agency之间的关系,则可以通过将内部SELECT建模为子查询来完成:

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) > ?

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM