2013-08-20 134 views
2

我有兩個型號,由多到許多關係SQLAlchemy的許多一對多和過濾

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"] 
??? 

任何幫助都令人難以置信的讚賞。謝謝!

回答

1

我看到兩個possibilites:要麼分別將兩個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中的子查詢必須返回標量結果。

+0

你是對的,它比SQLAlchemy更像一個SQL問題/誤解。謝謝! – saibotd

相關問題