应用 Python 做 web 开发,OR Mapping 的局部,通常会用到 Sqlalchemy,它是一个绝对重量级的数据库封装层,提供了丰盛的调用接口。
用 Sqlalchemy 实现查问是相当简略的,比方上面的 SQL:
select * from table_a where col1=3 and col2='abc'
写成代码就是:
TableA.query.filter(TableA.col1==3).filter(TableA.col2=='abc')
但有的时候,咱们会发现代码中常常有两条或多条查问,它们的条件是截然不同的,只有 select 前面有差异,比方我还想取个总数:
select count(*) from table_a where col1=3 and col2='abc'
db.session.query(func.count('*').filter(TableA.col1==3).filter(TableA.col2=='abc')
这就很顺当了,同样的代码被反复编写,如果这个条件简单,须要通过各种逻辑判断拼接的话,就更加好受:每条拼接语句都要 copy 一次,代码的坏滋味快溢出屏幕了~~~
有没有方法让它们共享同一个 filter 呢?还有有的,能够用 list 嵌套表达式,先把 filter 保存起来,最初再一起传给 query 对象:
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()
网上形容这个问题的文章不多,google 了半天,才找到一个答案:Apply condition based multiple filters in SQLAlchemy query
问题是它还有个谬误,把 *all_filters
写成了**all_filters
,害的我差点放弃。