用于筛选sqlalchemy查询的库。
sqlalchemy-filters的Python项目详细描述
过滤
假设我们有一个sqlalchemy 查询 对象:
fromsqlalchemyimportColumn,Integer,Stringfromsqlalchemy.ext.declarativeimportdeclarative_baseclassBase(object):id=Column(Integer,primary_key=True)name=Column(String(50),nullable=False)count=Column(Integer,nullable=True)Base=declarative_base(cls=Base)classFoo(Base):__tablename__='foo'# ...query=session.query(Foo)
然后我们可以对查询对象(多次)应用过滤器:
fromsqlalchemy_filtersimportapply_filters# `query` should be a SQLAlchemy query objectfilter_spec=[{'field':'name','op':'==','value':'name_1'}]filtered_query=apply_filters(query,filter_spec)more_filters=[{'field':'foo_id','op':'is_not_null'}]filtered_query=apply_filters(filtered_query,more_filters)result=filtered_query.all()
也可以过滤包含多个模型的查询, 包括连接:
classBar(Base):__tablename__='bar'foo_id=Column(Integer,ForeignKey('foo.id'))
query=session.query(Foo).join(Bar)filter_spec=[{'model':'Foo',field': 'name', 'op': '==', 'value': 'name_1'},{'model':'Bar',field': 'count', 'op': '>=', 'value': 5},]filtered_query=apply_filters(query,filter_spec)result=filtered_query.all()
应用过滤器 将尝试自动将模型连接到查询 如果它们不存在并且提供了特定于型号的筛选器。 例如,下面两个代码中的 filtered_query的值 块是相同的:
query=session.query(Foo).join(Bar)# join pre-applied to queryfilter_spec=[{'model':'Foo',field': 'name', 'op': '==', 'value': 'name_1'},{'model':'Bar',field': 'count', 'op': '>=', 'value': 5},]filtered_query=apply_filters(query,filter_spec)
query=session.query(Foo)# join to Bar will be automatically appliedfilter_spec=[{field': 'name', 'op': '==', 'value': 'name_1'},{'model':'Bar',field': 'count', 'op': '>=', 'value': 5},]filtered_query=apply_filters(query,filter_spec)
只有在sqlalchemy可以隐式地 确定联接的条件,例如 关键关系。
自动连接允许客户端灵活地筛选和排序 不指定服务器上所有可能的联接的相关对象 事先。
注意,第二个块的第一个过滤器没有指定模型。 它隐式地应用于 foo 模型,因为这是 传递到 应用过滤器的原始查询中的模型
也可以将过滤器应用于由字段或 功能:
query_alt_1=session.query(Foo.id,Foo.name)query_alt_2=session.query(func.count(Foo.id))