首页 > 解决方案 > SqlAlchemy - 如何根据保存为 NestedMutableJson 的键属性查询表

问题描述

假设 Postgres 用户表包含 NestedMutableJson 类型的属性。

first_name character varying (120)
last_name character varying (120
country_info NestedMutableJson
...
from sqlalchemy_json import NestedMutableJson
country_info = db.Column(NestedMutableJson, nullable=True)

country_info = {“名称”:“英国”,“代码”:“11”}

如何根据 country_info 键查询用户表。

POSTGRES 查询

SELECT * FROM user WHERE country_info ->> 'name' = 'UK'

是否有任何 SqlAlchemy 方式给出相同的查询结果?

我尝试了几种方法,例如:

方式一:

User.query.filter(User.country_info['name'].astext == 'UK').all()

错误:

Operator 'getitem' is not supported on this expression

方式二:

User.query.filter(User.country_info.op('->>')('name') == 'UK').all()

问题:

Always getting an empty response 

我想知道是否由列定义引起的问题db.Column(NestedMutableJson, nullable=True)

我避免使用 db.session.execute("SELECT * FROM user WHERE country_info ->> 'name' = 'UK'").fetchall()。寻找别的东西

标签: databasepostgresqlsqlalchemy

解决方案


只需使用允许您在 orm 进程中编写纯文本过滤器的文本,它的工作方式类似于dict的get函数,并且它也可以处理None字段。

User.query.filter(text("COALESCE(user.country_info ->> 'name', '') = 'UK'")).all()

注意表的名字应该是数据库中的真实名字


推荐阅读