我有一个带有JSON字段的模型:
class Item(db.Model)
...
data = db.Column(JSON, nullable=False)
...
数据包含一些JSON,例如:
{
"cost": 10.00,
"passengers": 2,
"surcharge": 1.6
}
我希望能够通过过滤器获得表中所有行的成本总和。我尝试了以下但是似乎没有效果。
db.session.query(func.count(Item.data['cost'])).filter(
Item.data["surcharge"].cast(Float) > 1
).scalar()
答案 0 :(得分:5)
您使用了错误的aggregate。 count(expression)
计算表达式不为空的行数。如果您想要总和,请使用sum(expression)
:
db.session.query(func.sum(Item.data['cost'].astext.cast(Numeric))).\
filter(Item.data['surcharge'].astext.cast(Numeric) > 1).\
scalar()
请注意,由于binary floats not being able to represent all decimal values,货币值和二进制浮点数学是一个糟糕的混合。而是使用正确的monetary type或Numeric
,在这种情况下,SQLAlchemy使用Decimal
来表示Python中的结果。
答案 1 :(得分:0)