在Sqlalchemy的查询中新共享filter
使用Python做web开发,OR Mapping的部分,通常会用到Sqlalchemy,它是一个相对重量级的数据库封装层,提供了丰富的调用接口。
【在Sqlalchemy的查询中新共享filter】用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
,害的我差点放弃。推荐阅读
- 节省|节省 58% IT 成本,调用函数计算超过 30 亿次,石墨文档的 Serverless 实践
- 算法-tree-二叉树的最大深度
- 浅议开发者面临的信息偏差影响因素
- 日常积累|学生为什么要在CSDN写博客()
- VUE3|VUE3 之 使用标签实现动画与过渡效果(下) - 这个系列的教程通俗易懂,适合新手
- 《网络是怎样连接的》读书笔记--第一章
- 逆波兰表达式(计算包含括号的四则运算表达式)
- Vue3|Vue3 如何实现全局异常处理()
- MySQL的四种事务隔离级别
- 浏览器的进程和线程