【问题标题】:Python, SqlAlchemy: Many to many relationship, find those withoutPython,SqlAlchemy:多对多关系,找到那些没有的
【发布时间】:2011-12-02 15:00:33
【问题描述】:

假设我有两种类型的对象,MoviesTags,通过 many to many relationship 中的 ORM 关联,关联表由 relationship()secondary 参数指示,我想能够找到,比如说,没有Tags 的所有Movies?我会运行什么样的查询来达到这种效果?

【问题讨论】:

    标签: python sql database-design sqlalchemy pylons


    【解决方案1】:

    如果 TagId 是 Movies 对象的一部分,这将是一个检查 Movies 上的 TagId 是否为空的简单案例:

    session.query(Movies).filter(Movies.TagId == None).all()   
    

    但是您的多对多评论建议使用 MoviesTags 链接实体,因此它比较棘手,并且涉及使用左外连接链接到 MoviesTags。

    a good guide to writing and debugging 类似的 SQL 查询。你基本上想要结束:

    select Movies.name from Movies 
    left outer join MoviesTags on Movies.MovieId = MoviesTags.MovieId 
    where MoviesTags.TagId is null
    

    【讨论】:

    • 除非我读错了,否则documentation 似乎表明 '== None' 构造也会为多对多生成 NOT EXISTS 子句?
    • 是的,无法遵循您的第一个建议。我在 Movies 表中没有 TagId,因为它是多对多的。我会考虑遵循您的第二个建议。
    【解决方案2】:

    使用any(),这对于此类查询特别有用。

    query = session.query(Movies).filter(~Movies.tags.any())
    

    这里tagsTags 的多对多关系名称。

    【讨论】:

      猜你喜欢
      • 2020-11-01
      • 1970-01-01
      • 1970-01-01
      • 2023-03-04
      • 1970-01-01
      • 1970-01-01
      • 2017-12-12
      • 2021-06-26
      • 2018-03-19
      相关资源
      最近更新 更多