2

我有两个模型,通过多对多关系加入

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

非常感谢任何帮助。谢谢!

4

1 回答 1

1

我看到了两种可能性:要么组合两个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必须返回标量结果。

于 2013-08-21T16:36:43.137 回答