使用Python进行web开发,ORMapping部分通常使用SQLAlchemy,它是一个比较重量级的数据库封装层,提供了丰富的调用接口。使用SQLAlchemy实现查询非常简单。例如下面的SQL:select*fromtable_awherecol1=3andcol2='abc'写成代码:TableA.query.filter(TableA.col1==3).filter(TableA.col2=='abc')但是有时候,我们会发现代码中经常有两个或多个查询,它们的条件是完全一样的,只是select之后有区别,比如我想得到一个总数:selectcount(*)从table_awherecol1=3andcol2='abc'db.session.query(func.count('*').filter(TableA.col1==3).filter(TableA.col2=='abc')这个很尴尬,同样的代码重复写,如果条件复杂,需要通过各种逻辑判断进行拼接,那就更难受了:每条拼接语句都要复制一次,而且臭臭的代码会溢出屏幕~~~有没有办法让它们共享同一个filter呢?也可以先用list嵌套表达式保存filter,然后一起传给查询对象:all_filters=[TableA.col1==3,TableA.col2=='abc']records=TableA.query.filter(*all_filters).all()count=db.session.query(func.count('*')).filter(*all_filters).first()网上描述这个问题的文章不多。我花了很长时间才找到答案:ApplyconditionbasedmultiplefiltersinSQLAlchemyquery。
