• 欢迎访问搞代码网站,推荐使用最新版火狐浏览器和Chrome浏览器访问本网站!
  • 如果您觉得本站非常有看点,那么赶紧使用Ctrl+D 收藏搞代码吧

在Sqlalchemy的查询中新共享filter

python 搞代码 3年前 (2022-03-30) 31次浏览 已收录 0个评论

应用Python做web开发,OR Mapping的局部,通常会用到Sqlalchemy,它是一个绝对重量级的数据库封装层,提供了丰盛的调用接口。

用Sqlalchemy实现查问是相当简略的,比方上面的SQL:

<code class="SQL">select * from table_a where col1=3 and col2='abc'

写成代码就是:

TableA.query.filter(TableA.col1==3).filter(TableA.col2=='abc')

但有的时候,咱们会发现代码中常常有两条或多条查问,它们的条件是截然不同的,只有select前面有差异,比方我还想取个总数:

<code class="SQL">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,害的我差点放弃。


搞代码网(gaodaima.com)提供的所有资源部分来自互联网,如果有侵犯您的版权或其他权益,请说明详细缘由并提供版权或权益证明然后发送到邮箱[email protected],我们会在看到邮件的第一时间内为您处理,或直接联系QQ:872152909。本网站采用BY-NC-SA协议进行授权
转载请注明原文链接:在Sqlalchemy的查询中新共享filter

喜欢 (0)
[搞代码]
分享 (0)
发表我的评论
取消评论

表情 贴图 加粗 删除线 居中 斜体 签到

Hi,您需要填写昵称和邮箱!

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址