繁体   English   中英

SQLAlchemy:通过辅助表以自定义条件进行外部联接

[英]Sqlalchemy: Outer join with custom condition through a secondary table

我正在尝试通过辅助表(多对多)使用自定义条件编写具有外部联接的查询。 我在弄清楚正确的语法时遇到了麻烦。

假设我有那些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",
        )

而且我想查询包含特定标记的项目,因此我需要使用外部联接。

如果标签仅链接到1个项目,则可以执行以下操作:

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表?

提前致谢!

在您的示例中,您不需要使用externaljoin,仅需要NOT表达式(条件前为“〜”)。

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM