I have a model with a JSON field:
class Item(db.Model)
...
data = db.Column(JSON, nullable=False)
...
The data contains some JSON such as:
{
"cost": 10.00,
"passengers": 2,
"surcharge": 1.6
}
I want to be able to get a sum of the cost across all rows in the table with a filter. I tried the following but that didn't seem to work.
db.session.query(func.count(Item.data['cost'])).filter(
Item.data["surcharge"].cast(Float) > 1
).scalar()
You're using the wrong aggregate. count(expression)
counts the number of rows for which the expression is not null. If you want a sum, use sum(expression)
:
db.session.query(func.sum(Item.data['cost'].astext.cast(Numeric))).\
filter(Item.data['surcharge'].astext.cast(Numeric) > 1).\
scalar()
Note that monetary values and binary floating point math is a bad mixture due to binary floats not being able to represent all decimal values. Instead use a proper monetary type, or Numeric
in which case SQLAlchemy uses Decimal
to represent the results in Python.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With