case() 的“whens”参数在引用一系列项目时,现在作为一系列位置元素传递

问题描述 投票:0回答:1

我想分别查询通过支付方式“现金”和“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
    )
python orm flask-sqlalchemy
1个回答
0
投票

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 中之前的行为。

© www.soinside.com 2019 - 2024. All rights reserved.