过滤烧瓶SQLAlchemy中的查询结果



我正在处理一个依赖于另一个查询结果的查询这是我的问题:是否可以使用另一个查询的结果来筛选查询?

我有两个表,我想通过连接它们来查询它们。我尝试了这个查询:

# Get all data for a particular country
de_market= db.session.query(
func.count(certificate.id),
func.month(certificate.creation_time).label('month'),
func.year(certificate.creation_time).label('year')).join(B2cCustomer.certificates).group_by(func.month(certificate.creation_time),
func.year(certificate.creation_time))
.filter(certificate.report_sent != None)
.filter(B2cCustomer.market == market_code)
.all()

所以在结果之后,我想再次过滤结果:

# filter the country data by the different msm campaign
get_data_based_on_msm = de_market.filter(certifcate.msm == msm).all() 

我这样做了,但没有得到好的结果。有更好的方法吗?

是否可以使用另一个查询的结果来筛选查询?

是。

嗯,有点。

您写道:

de_market = db.session.query(
...
.filter(certificate.report_sent != None)
.filter(B2cCustomer.market == market_code)
.all()
# and then expressed an interest in
de_market.filter(certificate.msm == msm).all() 

也就是说,我们分配q = ... .filter(cond1).filter(cond2)后来我们对CCD_ 2感兴趣。

你能做到吗?对现在,美中不足的是。您最终使用.all()检索了结果行。我的建议是不要那样做。

克隆查询,编写返回这样的查询的助手函数,执行您必须执行的操作,使未执行的查询可用。

有了这些,是的,你可以很容易地添加额外的过滤器。以下是一些惯用用法:

q = ... .filter(cond1).filter(cond2)
if cond3:
q = q.filter(cond3)
if limit:
q = q.limit(limit)
return q

但一旦您要求使用CCD_ 4的结果,所有的赌注都被取消了,之后您就不能修改查询了。

最新更新