Python SQLAlchemy:查询包含数组和计数匹配项的JSON列(PostgreSQL)

Python SQLAlchemy:查询包含数组和计数匹配项的JSON列(PostgreSQL),python,json,postgresql,sqlalchemy,Python,Json,Postgresql,Sqlalchemy,我对SQLAlchemy和在db中使用JSON列有点陌生 我的数据库模型 from sqlalchemy.dialects.postgresql import JSON class Traydetails(db.Model): id= db.Column(db.Integer, autoincrement=True, primary_key=True) traynumber = db.Column(db.String, unique=True) saf

我对SQLAlchemy和在db中使用JSON列有点陌生

我的数据库模型

from sqlalchemy.dialects.postgresql import JSON
    
class Traydetails(db.Model):
    
    id= db.Column(db.Integer, autoincrement=True, primary_key=True)
    traynumber = db.Column(db.String, unique=True)
    safety_data = db.Column(JSON)
我的JSON结构

[{"Formulation": "Form1", "Hazard Rating": "Class B"}, {"Formulation": "Form2", "Hazard Rating": "Class B"}, {"Formulation": "Form3", "Hazard Rating": "Class B"}, {"Formulation": "Form4", "Hazard Rating": "Class B"}, {"Formulation": "Form5", "Hazard Rating": "Class B"}, {"Formulation": "Form6", "Hazard Rating": "Class B"}, {"Formulation": "Form7", "Hazard Rating": "Class B"}, {"Formulation": "Form8", "Hazard Rating": "Class B"}, {"Formulation": "Form9", "Hazard Rating": "Class B"}, {"Formulation": "Form10", "Hazard Rating": "Class B"}]
尝试查询-1

hazard = Traydetails.query.filter(Traydetails.safety_data['Hazard Rating'].astext == "Class B").count()
它什么也不返回

尝试查询-2

hazard = Traydetails.query.filter(Traydetails.safety_data[0]['Hazard Rating'].astext.cast(Unicode) == "Class B").count()
它只返回一个(因为我正在比较一个位置)

但我的目标是计算危险等级(关键)中有多少B级。
注意:将有不同类型的类,如A类、B类、N类。

您可以使用postgres函数
json\u数组\u元素
形成一个子查询,您可以对其进行过滤,以检索
B类
危险等级的计数:

来自sqlalchemy导入函数
subq=session.query(func.json_数组_元素(traydeails.safety_数据).label('safety_数据')).subquery()
count=session.query(subq.filter)(subq.c.safety_data.op('->>')('Hazard Rating')=='classb')。count()
打印(计数)
过滤器
正在使用子查询中标有安全数据的列:
subq.c.safety\u data
。在
.op
中,我们使用一个自定义操作符
->
,它将json转换为文本。有关操作员的更多信息,请参阅