如何使用SqlAlchemy在Postgres中查询JSON数组?
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了如何使用SqlAlchemy在Postgres中查询JSON数组?,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含1553字,纯文字阅读大概需要3分钟。
内容图文
我定义了一个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,我怎样才能找回乔?
我试过这个
User.query.filter(User.contact_list.contains({“phone”:[“147889”]})).all()
但是,它返回一个空列表,[]
我怎样才能做到这一点?
解决方法:
您忘记了您的JSON路径也应该包含最外层的数组:
User.query.filter(User.contact_list.contains([{"phone": ["147889"]}])).all()
将返回您要查找的用户.如果您的JSON包含具有键“phone”等的对象,则原始查询将匹配.请注意,这将返回有问题的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在Postgres中查询JSON数组?全部内容,希望文章能够帮你解决如何使用SqlAlchemy在Postgres中查询JSON数组?所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。