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

ski*_*789 3 python postgresql json sqlalchemy flask

我有一个带有JSON字段的模型:

class Item(db.Model)
   ...
   data = db.Column(JSON, nullable=False)
   ...
Run Code Online (Sandbox Code Playgroud)

数据包含一些JSON,例如:

{
    "cost": 10.00,
    "passengers": 2,
    "surcharge": 1.6
}
Run Code Online (Sandbox Code Playgroud)

我希望能够通过过滤器获得表中所有行的成本总和.我尝试了以下但是似乎没有用.

db.session.query(func.count(Item.data['cost'])).filter(
          Item.data["surcharge"].cast(Float) > 1
      ).scalar()
Run Code Online (Sandbox Code Playgroud)

Ilj*_*ilä 5

你使用的是错误的聚合.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()
Run Code Online (Sandbox Code Playgroud)

请注意,货币值和二进制浮点数学是一个糟糕的混合,因为二进制浮点数不能表示所有十进制值.而是使用适当的货币类型,或者NumericSQLAlchemy用于Decimal在Python中表示结果的情况.