2017-08-15 56 views
1

我有一個JSON領域的典範:查詢特定的JSON列(Postgres的)與SQLAlchemy的

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() 

回答

3

您使用了錯誤的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 typeNumeric,在這種情況下,SQLAlchemy使用Decimal來表示Python中的結果。

+0

雖然PostgreSQL的'JSONB'存儲數字的數字和'JSON'作爲十進制字符串...但是,需要一些特殊的處理與Python ... –

+0

謝謝你的工作 – skittles789

0

您需要使用Float代替Integercast

db.session.query(func.count(Item)).filter(
      Item.data['surcharge'].cast(Float) > 1 
    ).all() 
+0

公平點,我更新了查詢,但仍然無效。它只返回0. – skittles789