代码之家  ›  专栏  ›  技术社区  ›  fips

如何使用SQLAlchemy ORM实现子选择?

  •  2
  • fips  · 技术社区  · 6 年前

    我有以下型号:

    • 相册:id,name,…
    • 曲目:ID,专辑ID,…

    我需要使用sqlacalchemy orm生成下面的查询:

    SELECT 
      Album.name,
      (
        SELECT COUNT(*) as total_count
        FROM Track
        WHERE Track.album_id = Album.id
      ) as tracks
    FROM
      Album
    WHERE
      Album.band = ‘Metallica’ AND
      tracks.total_count > 10
    

    迄今为止的准则是:

    tracks = session \
      .query(func.count('*').label('total_count')) \
      .select_from(Track) \
      .filter(Track.album_id == Album.id) \
      .subquery()
    
    query = session \
      .query(Album.name, tracks.c.total_count) \
      .filter(Album.band == 'Metallica') \
      .filter(tracks.c.total_count > 10)
    

    生成的查询如下:

    SELECT
      Album.name,
      anon_1.total_count
    FROM
      Album,
      (
        SELECT count('*') AS total_count
        FROM Track, Album
        WHERE Track.album_id = Album.id
      ) AS anon_1
    WHERE
      Album.band = ‘Metallica’ AND
      anon_1.total_count > 10
    

    这要慢得多。有什么想法我如何返回作为根选择一部分的子选择结果?谢谢!

    1 回复  |  直到 6 年前
        1
  •  1
  •   Ilja Everilä    6 年前

    query = session \
      .query(Album.name, func.count()) \
      .join(Track) \
      .filter(Album.band == 'Metallica') \
      .group_by(Album.id) \
      .having(func.count() > 10)
    

    Album.name Album.id