简体   繁体   中英

SQL statement to sqlalchemy ORM query API

I have the following SQL statement which works as expected, but I want to do the same thing using the Query API of sqlalchemy, I tried the following but it returns empty. Any idea how I can get this SQL statement by composing the Query API operations?

The raw SQL statement is:

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

What I currently have using the ORM Query 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)

If no relationship has been configured between mission_ownership and mission_agency at the ORM level, this can be done by modelling the inner SELECT as a 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)

Which generates this 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) > ?

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

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