如何解决SQLAlchemy子查询
我是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
解决方法
添加.c
以访问子查询的列:
请使用subquery().count == len(genre_ids))
代替subquery().c.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))
)
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。