【问题标题】:Sqlalchemy subquerySqlalchemy 子查询
【发布时间】:2020-09-30 00:17:06
【问题描述】:

我是 sqlalchemy 的新手,请帮忙。我有这个 SQL 查询:

SELECT * FROM films
WHERE (
    SELECT count(film_to_genre.id) FROM film_to_genre
    WHERE films.id = film_to_genre.film_id AND film_to_genre.genre_id IN (2, 14)
) = 2

我想在 SqlAlchemy 中编写它。这是我尝试过的:

db.query(models.Film)
  .filter(db.query(func.count(models.FilmToGenre.id))
                     .filter(and_(models.Film.id == models.FilmToGenre.film_id,
                                  models.FilmToGenre.genre_id.in_(genre_ids)))
                     .subquery().count == len(genre_ids)))

它转换为这个 SQL(子句“WHERE false”中的问题,它立即评估子查询):

SELECT films.id AS films_id, films.kinopoisk_id AS films_kinopoisk_id, films.title AS films_title, films.year AS films_year, films.budget AS films_budget, films.run_time AS films_run_time, films.description AS films_description 
FROM films JOIN film_to_genre ON films.id = film_to_genre.film_id 
WHERE false
 LIMIT %(param_1)s OFFSET %(param_2)s

【问题讨论】:

    标签: python sql postgresql sqlalchemy flask-sqlalchemy


    【解决方案1】:

    添加.c访问子查询的列:

    请使用subquery().c.count == len(genre_ids))代替subquery().count == len(genre_ids))


    不过,我更喜欢as_scalar 选项:

    genre_ids = [2, 14]
    sq = (
        session.query(
            func.count(FilmToGenre.id)
        )
        .filter(
            and_(
                FilmToGenre.film_id == Film.id,
                FilmToGenre.genre_id.in_(genre_ids),
            )
        )
        .as_scalar()
    )
    
    q = (
        session.query(Film)
        .filter(sq == len(genre_ids))
    )
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-07-22
      • 2023-03-18
      • 2014-04-10
      • 2021-09-21
      • 2011-09-06
      • 2022-01-24
      • 2015-07-30
      • 1970-01-01
      相关资源
      最近更新 更多