SQLAlchemy:在同一查询中执行双重过滤和求和

时间:2013-08-21 18:29:18

标签: python sqlalchemy

我的数据库中有一个总帐表,其中包含以下列:member_idis_creditamount。我想得到会员的当前余额。

理想情况下,可以通过两个查询获得第一个查询的is_credit == True,第二个查询的is_credit == False接近:

credit_amount = session.query(func.sum(Funds.amount).label('Debit_Amount')).filter(Funds.member_id==member_id, Funds.is_credit==True)

debit_amount = session.query(func.sum(Funds.amount).label('Debit_Amount')).filter(Funds.member_id==member_id, Funds.is_credit==False)

balance = credit_amount - debit_amount

然后减去结果。有没有办法在一个查询中进行上述运行以获得余额?

1 个答案:

答案 0 :(得分:0)

从评论中你可以说混合动力车现在太先进了,所以我会提出一个更简单但不那么有效的解决方案(仍然可以):

(session.query(Funds.is_credit, func.sum(Funds.amount).label('Debit_Amount')).
 filter(Funds.member_d==member_id).group_by(Funds.is_credit))

这会怎么做?您将收到两行结果,一个具有信用,另一个具有借方,具体取决于结果的is_credit属性。第二部分(Debit_Amount)将是值。然后,您可以对它们进行评估以获得结果:只有一个查询可以获取这两个值。

如果您不确定group_by的作用,我建议您在SQLAlchemy中执行此操作之前先阅读SQL。 SQLAlchemy提供了非常简单的SQL使用,但它也要求您理解SQL。因此,我建议:首先在SQL中构建一个查询并查看它是否符合您的要求 - 然后将其转换为SQLAlchemy并查看它是否也是如此。否则,SQLAlchemy通常会生成效率极低的查询,因为您提出了错误的问题。