首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >在SQLAlchemy中执行除其他选择

在SQLAlchemy中执行除其他选择
EN

Stack Overflow用户
提问于 2022-02-21 16:49:25
回答 1查看 1.6K关注 0票数 1

我想要运行一个SQLAlchemy查询,该查询将提取电影in的列表,但如果在备用表中找到了一些in,则应该排除它们。

我可以在SQL (我使用的是SQLlite 3.34.1)中这样做,但只需简单地使用除了后面的SELECT子句。

这就是我想要做的。它回来的结果是数以百计的结果,而不是大约8个,它应该找到,我不明白。

代码语言:javascript
运行
复制
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))

编辑:

我现在已经为上面的查询创建了一个稍微复杂一些的查询。在第一个查询中,我希望将结果加入到另一个表,而在第二个查询中,我希望添加一个筛选器。不过,我正在寻找相同的结果;我希望选择“电影”表中的所有电影,并排除用户已列入黑名单的电影。

这是我目前正在尝试的,但它提出了下面的笛卡尔警告;

代码语言:javascript
运行
复制
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查询:

代码语言:javascript
运行
复制
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))

当我删除子查询时,会得到以下错误;

代码语言:javascript
运行
复制
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)

我好迷茫

EN

回答 1

Stack Overflow用户

发布于 2022-02-21 19:39:01

您需要对Movies模型而不是User模型进行筛选,以避免获得查询的笛卡儿产品。这应该是可行的:

代码语言:javascript
运行
复制
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:

代码语言:javascript
运行
复制
user_has_seen = db.session.query(User.movie_id)
final_results = db.session..query(Movies.movie_id).except_(q1)

注意,SQLAlchemy ORM在嵌套SELECTs中执行EXCEPTs:

代码语言:javascript
运行
复制
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
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/71210053

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档