我有一个带有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()

最佳答案

你用错了aggregatecount(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 typeNumeric,在这种情况下,SQLAlchemy使用Decimal以Python表示结果。

07-27 19:49