我想分别查询通过支付方式“现金”和“upi”生成的金额的 sum() 函数。 这是我的现金和 UPI 箱。
cash_case = db.case([(Order.payment_method == 'cash', Order.amount)],else_=0)
upi_case = db.case([(Order.payment_method == 'upi', Order.amount)],else_=0)
这是我的询问,
# query to filter desired response
query = db.session.query(
db.func.sum(Order.amount).label('amount'),
db.func.sum(Order.pax).label('pax'),
db.func.coalesce(db.func.sum(VehicalOrder.commission_amount, 0)).label('commission'),
db.func.sum(upi_case).label('upi'),
db.func.sum(cash_case).label('cash'),
(db.func.sum(Order.amount) - db.func.coalesce(db.func.sum(VehicalOrder.commission_amount, 0))).label('profit'),
db.func.date_format(Order.created_at, '%d %M %Y').label('date')
).filter(
Order.created_at == date
).outerjoin(
VehicalOrder, Order.id == VehicalOrder.order_id
)
对
case
的调用会发出此错误消息:
sqlalchemy.exc.ArgumentError:case() 的“whens”参数在引用一系列项目时,现在作为一系列位置元素而不是列表传递。
正如错误消息所解释的,在列表中传递
when
子句不再有效,它们应该像这样传递:
import sqlalchemy as sa # just use db if using Flask-SQLAlchemy
cash_case = sa.case((Order.payment_method == 'cash', Order.amount), else_=0)
upi_case = sa.case((Order.payment_method == 'upi', Order.amount), else_=0)
或更笼统地说:
my_case = sa.case(
(MyModel.foo == 'foo', 1), (MyModel.bar == 'bar', 2), else_=0
)
此更改已添加到 SQLAlchemy v1.4 中作为未来 API 的一部分,并取代了 v2.x 中之前的行为。