Sqlalchemy:通过辅助表格

时间:2016-02-03 12:56:46

标签: python sqlalchemy

我正在尝试通过辅助(多对多)表使用自定义条件编写带外连接的查询。我在找出正确的语法时遇到了麻烦。

假设我有那些项目和标签表, 他们之间有多对多的关系:

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

提前致谢!

1 个答案:

答案 0 :(得分:3)

在你的例子中,你不需要使用outerjoin,你只需要表达式(条件之前的“〜”)。

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

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