使用sqlalchemy查询特定的JSON列(postgres)


问题内容

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

问题答案:

您使用的汇总错误。count(expression)计算 表达式
不为null的行数。如果您想要一笔款项,请使用sum(expression)

db.session.query(func.sum(Item.data['cost'].astext.cast(Numeric))).\
    filter(Item.data['surcharge'].astext.cast(Numeric) > 1).\
    scalar()

请注意,由于二进制浮点数不能表示所有十进制值,因此货币值和二进制浮点数数学运算是不好的组合。而是使用适当的货币类型,或者Numeric在这种情况下,SQLAlchemy使用DecimalPython表示结果。