我想要运行一个SQLAlchemy查询,该查询将提取电影in的列表,但如果在备用表中找到了一些in,则应该排除它们。
我可以在SQL (我使用的是SQLlite 3.34.1)中这样做,但只需简单地使用除了后面的SELECT子句。
这就是我想要做的。它回来的结果是数以百计的结果,而不是大约8个,它应该找到,我不明白。
movies = db.session.query(Movies)
user_has_seen = db.session.query(User.movie_id)
final_results = db.session.query(movies).filter(~User.movie_id.in_(user_has_seen))
编辑:
我现在已经为上面的查询创建了一个稍微复杂一些的查询。在第一个查询中,我希望将结果加入到另一个表,而在第二个查询中,我希望添加一个筛选器。不过,我正在寻找相同的结果;我希望选择“电影”表中的所有电影,并排除用户已列入黑名单的电影。
这是我目前正在尝试的,但它提出了下面的笛卡尔警告;
SAWarning: SELECT statement has a cartesian product between FROM element(s) "movies" and FROM element "anon_1". Apply join condition(s) between each element to resolve.
下面是SQLAlchemy查询:
full_movies = db.session.query(movies).join(Sometable, movies.id == sometable.id).subquery()
user_has_seen = db.session.query(User.movie_id).filter(user.seen == True).subquery()
final_results = db.session.query(full_movies).filter(~Movies.movie_id.in_(user_has_seen))
当我删除子查询时,会得到以下错误;
sqlalchemy.exc.ArgumentError: Column expression or FROM clause expected, got <sqlalchemy.sql.selectable.Select object at 0x7faefb0ab590> object resolved from <flask_sqlalchemy.BaseQuery object at 0x7faefb0d3d10> object. To create a FROM clause from a <class 'sqlalchemy.sql.selectable.Select'> object, use the .subquery() method. (Background on this error at: https://sqlalche.me/e/14/89ve)
我好迷茫
发布于 2022-02-21 19:39:01
您需要对Movies
模型而不是User
模型进行筛选,以避免获得查询的笛卡儿产品。这应该是可行的:
user_has_seen = db.session.query(User.movie_id)
final_results = db.session.query(Movies).filter(~Movies.movie_id.in_(user_has_seen))
SQLAlchemy ORM确实支持例外,但适用于匹配列类型的约束。这只会给你提供电影ids:
user_has_seen = db.session.query(User.movie_id)
final_results = db.session..query(Movies.movie_id).except_(q1)
注意,SQLAlchemy ORM在嵌套SELECT
s中执行EXCEPT
s:
SELECT anon_1.movies_movie_id AS anon_1_movies_movie_id
FROM (
SELECT movies.movie_id AS movies_movie_id
FROM movies
EXCEPT
SELECT users.movie_id AS users_movie_id
FROM users
) AS anon_1
https://stackoverflow.com/questions/71210053
复制相似问题