Sqlalchemy 子查询
Posted
技术标签:
【中文标题】Sqlalchemy 子查询【英文标题】:Sqlalchemy subquery 【发布时间】: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
【问题讨论】:
【参考方案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))
)
【讨论】:
以上是关于Sqlalchemy 子查询的主要内容,如果未能解决你的问题,请参考以下文章