【问题标题】:SQLAlachmey: ORM filter to match all items in a list, not anySQLAlachmey:ORM 过滤器以匹配列表中的所有项目,而不是任何
【发布时间】:2016-05-26 15:47:14
【问题描述】:

我想搜索一个 SQLAlachmey 列表(通过关联表)并通过过滤器匹配其中的多个项目。

我已经查看了this question,但我希望仅通过 ORM 过滤器来完成此操作(第二个答案不是通过关联表)。

数据库表设置:

tag_ast_table = Table('tag_association',
                  Base.metadata,
                  Column('file_id', Integer, ForeignKey('files.id')),
                  Column('tag_id', Integer, ForeignKey('tags.id')),
                  PrimaryKeyConstraint('file_id', 'tag_id'))


class File(Base):
    __tablename__ = 'files'

    id = Column(Integer, primary_key=True)
    tags = relationship("Tag", secondary=tag_ast_table)

class Tag(Base):
    __tablename__ = 'tags'

    id = Column(Integer, primary_key=True)
    tag = Column(String)

匹配任何我想修改以匹配所有的当前过滤器:

query = db.query(File).filter(File.tags.any(Tag.tag.in_(my_list))).all()

【问题讨论】:

    标签: python python-2.7 python-3.x sqlalchemy


    【解决方案1】:

    在 SQL 中解决此问题的合理方法(在您的链接中提到)是使用 having count(distinct tags.id) = <your number of tags>

    所以查询需要两件事:它需要一个 in 来查找您的标签列表,它需要一个 having 来查找存在的完整计数。

    query = (
        session.query(File)
        .join(File.tags)
        .filter(Tag.tag.in_(search_tags))
        .group_by(File)
        .having(func.count(distinct(Tag.id)) == len(search_tags))
    )
    

    作为一种极端情况,如果 search_tags 是一个空列表,您将不会得到任何结果,因此最好先检查一下。

    【讨论】:

    • 做到了,非常感谢您的帮助!
    猜你喜欢
    • 2012-11-01
    • 2012-10-27
    • 1970-01-01
    • 1970-01-01
    • 2016-12-04
    • 2022-01-24
    • 2012-11-04
    • 2016-02-27
    • 1970-01-01
    相关资源
    最近更新 更多