gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-04 07:39:03 26 4
gpt4 key购买 nike

我对 SQLAlchemy 和在数据库中使用 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()

它只返回一个(因为我正在比较一个位置)

但我的目标是计算 hazardrating (key) 中有多少 B 类。请注意,会有不同类型的类,例如 A 类、B 类、N 类。

最佳答案

您可以使用 postgres 函数 json_array_elements 形成一个子查询,您可以过滤该子查询以检索 B 级 危险等级的计数:

from sqlalchemy import func
subq = session.query(func.json_array_elements(Traydetails.safety_data).label('safety_data')).subquery()

count = session.query(subq).filter(subq.c.safety_data.op('->>')('Hazard Rating') == 'Class B').count()
print(count)

过滤器 使用子查询的 safety_data 标签列:subq.c.safety_data。对于 .op,我们使用自定义运算符 ->> 将 json 转换为文本。参见 the docs有关运营商的更多信息。

关于python - SQLAlchemy:查询包含数组和计数匹配项的 JSON 列 (PostgreSQL),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/67583289/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com