gpt4 book ai didi

sqlalchemy - 如何使用 SqlAlchemy 在 Postgres 中查询 JSON 数组?

转载 作者:太空狗 更新时间:2023-10-30 02:52:45 52 4
gpt4 key购买 nike

我定义了一个 SqlAlchemy 模型

from sqlalchemy.dialects.postgresql import JSONB

class User(db.Model):
__tablename__ = "user"
id = db.Column(db.Integer, primary_key=True)
nickname = db.Column(db.String(255), nullable=False)
city = db.Column(db.String(255))
contact_list = db.Column(JSONB)
created_at = db.Column(db.DateTime, default=datetime.utcnow)

def add_user():
user = User(nickname="Mike")
user.contact_list = [{"name": "Sam", "phone": ["123456", "654321"]},
{"name": "John", "phone": ["159753"]},
{"name": "Joe", "phone": ["147889", "98741"]}]
db.session.add(user)
db.session.commit()

if __name__ == "__main__":
add_user()

如何使用电话从我的contact_list 中检索姓名?例如,我有147889,如何检索Joe

我试过了

User.query.filter(User.contact_list.contains({"phone": ["147889"]})).all()

但是,它返回一个空列表,[]

我该怎么做?

最佳答案

您只是忘记了您的 JSON 路径也应该包括最外层的数组:

User.query.filter(User.contact_list.contains([{"phone": ["147889"]}])).all()

将返回您要查找的用户。如果您的 JSON 包含具有键“电话”等的对象,则原始查询将匹配。请注意,这将返回有问题的 User 对象,而不是 JSON 结构中的特定对象/名称。如果您希望这样做(这似乎是最终目标),您可以扩展每个用户的数组元素,根据结果记录进行过滤,然后选择名称:

val = db.column('value', type_=JSONB)
db.session.query(val['name'].astext).\
select_from(User,
db.func.jsonb_array_elements(User.contact_list).alias()).\
filter(val.contains({"phone": ["147889"]})).\
all()

另一方面,上面的查询不像第一个查询那样索引友好,因为它必须在过滤之前展开所有数组,所以首先找到联系人中包含电话的用户可能是有益的在子查询或 CTE 中列出,然后展开和过滤。

关于sqlalchemy - 如何使用 SqlAlchemy 在 Postgres 中查询 JSON 数组?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52190109/

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