【问题标题】:Sqlalchemy: Outer join with custom condition through a secondary tableSqlalchemy:通过辅助表使用自定义条件进行外部连接
【发布时间】:2016-10-21 20:13:23
【问题描述】:

我正在尝试通过辅助(多对多)表使用自定义条件编写带有外部联接的查询。我无法找出正确的语法。

假设我有那些 Item 和 Tag 表, 它们之间是多对多的关系:

item_to_tag_table = Table('item_to_tag', Base.metadata,
    Column('item_id', Integer, ForeignKey('item.id')),
    Column('tag_id', Integer, ForeignKey('tag.id')))

在Item中具有如下关系:

class Item(Base):
    id = Column(Integer, primary_key=True)

    tags = relationship("Tag",
        secondary = item_to_tag_table,
        backref = "items",
        )

而我想查询包含特定标签的项目,所以我需要使用外连接。

如果一个标签只链接到一个项目,我可以这样做:

DBSession.query(Items)\
    .outerjoin(Tag, and_(Tag.itemId == Item.id, Tag.name == "foo"))\
    .having(func.count(Tag.id) < 1)

但是,对于多对多关系,我无法确定正确的语法:

DBSession.query(Items)\
    .outerjoin(Tag, and_( ?? , Tag.name == "foo"))\
    .having(func.count(Tag.id) < 1)

有什么想法吗?我是否必须进行 2 个外部连接,一个连接到辅助表,另一个连接到 Tag 表?

提前致谢!

【问题讨论】:

    标签: python sqlalchemy


    【解决方案1】:

    在您的示例中,您不需要使用外连接,只需要 NOT 表达式(条件前的“~”)。

    要过滤多对多关系,请使用 .any()

    DBSession.query(Items)\
        .join(Tag)\ 
        .filter(~Item.tags.any(name="foo"))
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-11-19
      • 1970-01-01
      • 2020-08-16
      • 2012-07-11
      • 1970-01-01
      • 1970-01-01
      • 2016-07-24
      • 2016-07-14
      相关资源
      最近更新 更多