簡體   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