SQLAlachmey:ORM过滤器匹配列表中的所有项目,而不是任何项目

时间:2016-02-15 16:30:05

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

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

我已经审核了http://crsmithdev.com/arrow/,但我希望仅通过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()

感谢您的帮助!

1 个答案:

答案 0 :(得分:1)

在SQL中(在您的链接中提到)的合理方法是使用var $clone = $("#RowPly-R1-P1"); $clone.find('[id]').addBack().attr('id', function(i, id) { return id.replace(/-P\d+$/, function(str) { return "-P" + i; }); });

因此,查询需要两件事:它需要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)) ) 是一个空列表,您将无法获得任何结果,因此最好先检查一下。