Database SqlAlchemy-如何基于另存为NestedMutableJson的键属性查询表

Database SqlAlchemy-如何基于另存为NestedMutableJson的键属性查询表,database,postgresql,sqlalchemy,Database,Postgresql,Sqlalchemy,假设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) 国家信

假设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)
国家信息={“名称”:“英国”,“代码”:“11”}

如何根据国家/地区信息键查询用户表

POSTGRES查询

SELECT * FROM user WHERE country_info ->> 'name' = 'UK'
任何SqlAlchemy方法都会给出相同的查询结果吗

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

方式1:

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

Operator 'getitem' is not supported on this expression
方式2:

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

Always getting an empty response 
我想知道这个问题是否是由列定义引起的
db.column(NestedMutableJson,nullable=True)

我避免使用db.session.execute(“选择*来自用户所在国家/地区信息->>“名称”=“英国”).fetchall()。在找别的东西吗

您可以使用
.op('->')
以以下方式使用PostgreSQL运算符
->

从sqlalchemy导入列,整数,创建引擎,字符串,选择
从sqlalchemy.ext.declarative导入声明性基础
从sqlalchemy.orm导入会话
从sqlalchemy.dialogs.postgresql导入JSON
从sqlalchemy_json导入NestedMutableJson
dburl='postgresql://...'
Base=声明性_Base()
类别CountryInfo(基本):
__tablename_uuu='国家信息'
id=列(整数,unique=True,nullable=False,primary\u key=True)
名称=列(字符串)
国家/地区信息=列(NestedMutableJson,nullable=True)
定义报告(自我):
返回f'CountryInfo({self.name!r},{self.country_info!r})'
引擎=创建引擎(dburl,future=True,echo=True)
Base.metadata.drop_all(引擎)
Base.metadata.create_all(引擎)
将会话(引擎)作为会话:
test=CountryInfo(name='test',country_info={“name”:“UK”,“code”:“11”})
test2=CountryInfo(name='test2',country_info={“name”:“NL”,“code”:“12”})
test3=CountryInfo(name='test3',country_info={“name”:“UK”,“code”:“13”})
会话.添加(测试)
session.add(test2)
session.add(test3)
session.commit()
stmt=select(CountryInfo).filter(CountryInfo.country_info.op('->>')('name')==“UK”)
query=session.execute(stmt).all()
对于查询中的行:
打印(行)
这将产生以下SQL:

SELECT country_info.id, country_info.name, country_info.country_info
FROM country_info
WHERE (country_info.country_info ->> %(country_info_1)s) = %(param_1)s
使用
{'country_info_1':'name','param_1':'UK'}

其结果是:

(CountryInfo('test',{'name':'UK','code':'11'})
(CountryInfo('test3',{'name':'UK','code':'13'}),)
查看数据类型文档

您应该能够使用此筛选子句
select(CountryInfo).filter(CountryInfo.country\u info['name'].astext==“UK”)
只需使用文本即可在orm进程中编写纯文本过滤器,它的工作原理类似于获取dict函数,还可以处理字段

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

请注意,表的名称应该是数据库中的真实名称

我曾经使用过它,但是我总是得到一个空数组,即使我应用了相同的Postgres查询,并且得到了预期的响应。可能是因为我的列被定义为以下
db.column(NestedMutableJson,nullable=True)
?问题内容已经更新@rfkortakaasi,我已经用
NestedMutableJson
测试了它,得到了相同的结果…@KhaledRamadan我已经用
NestedMutableJson
测试了我的示例(请参见更改)。使用
JSON
时,返回的结果相等。Van中的示例不适用于
NestedMutableJson
。我得到的这个运算符“getitem”在此表达式上不受支持,可能是因为我的列被定义为NestedMutableJson不确定。问题已在@Van更新。事实上,它必须与正在使用的
NestedMutableJson
相关,从
astext
中可以看出,它实现了所有这些操作,但与
NestedMutableJson
不起作用。当使用type
JSON
时,这也可以正常工作。