簡體   English   中英

SQLAlchemy多對多AND過濾器

[英]SQLAlchemy many-to-many AND filter

我有兩個模型,並通過多對多關系加入

image_tag = Table('image_tag', Base.metadata,
    Column('image_id', Integer, ForeignKey('images.id')),
    Column('tag_id', Integer, ForeignKey('tags.id'))
)

class Image(Base):
    __tablename__='images'
    id = db.Column(db.Integer, primary_key=True)
    tags = relationship('Tag', secondary=image_tag, backref=backref('images', order_by=id.desc()), lazy="joined")

class Tag(Base):
    __tablename__ = 'tags'
    id = Column(Integer, primary_key=True)
    tag = Column(String(64), unique=True)

現在假設我要按標簽過濾圖片-簡單:

_tag = "foo"
Image.query.filter(Image.tags.any(tag=_tag)).all()

但是,如果我想按許多標簽過濾並且只想匹配那些與所有標簽匹配的圖像該怎么辦?

tags = ["foo", "bar"]
???

任何幫助都令人感激。 謝謝!

我看到兩個可能性:要么合並兩個分別檢查每個元素的EXIST子句,要么指定一個where子句,如下所示:

WHERE (SELECT COUNT(*) FROM ... WHERE tags.tag in ("foo", "bar")) = 2

兩種解決方案都很難看,但我在這里看到的更多問題是SQL的方式而不是SQLAlchemy。

在這兩種情況下,我都建議您先構建一個普通的SQL查詢,對其進行測試,然后再等效地在SQLAlchemy中進行構建。

順便說一下,我可以想象這兩種解決方案在處理大量數據時效率都非常低,但是我在這里看不到任何解決方案。

最初,我會嘗試使用類似WHERE (SELECT tags.tag FROM ...) = ("foo", "bar")但這似乎不是有效的SQL(至少MySQL向我拋出了錯誤),因為WHERE子查詢必須返回標量結果。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM