Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/348.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python Sqlalchemy筛选器在数组中嵌套jsonb_Python_Postgresql_Sqlalchemy_Jsonb - Fatal编程技术网

Python Sqlalchemy筛选器在数组中嵌套jsonb

Python Sqlalchemy筛选器在数组中嵌套jsonb,python,postgresql,sqlalchemy,jsonb,Python,Postgresql,Sqlalchemy,Jsonb,我有一个PostgresJSONB字段,其中包含一些嵌套数组和其他对象 来自sqlalchemy.dialogs.postgresql导入JSONB 类族(db.Model): meta=db.Column(JSONB) joes=家庭(元)=[ { “姓名”:“乔”, “儿童”:[ { “姓名”:“简” }, { “姓名”:“凯特” } ] }, { “姓名”:“丽莎”, “儿童”:[ { “姓名”:“玛丽” }, { “姓名”:“大卫” } ] }, ]) 有没有办法查询所有名字中有某个子

我有一个PostgresJSONB字段,其中包含一些嵌套数组和其他对象

来自sqlalchemy.dialogs.postgresql导入JSONB
类族(db.Model):
meta=db.Column(JSONB)
joes=家庭(元)=[
{
“姓名”:“乔”,
“儿童”:[
{
“姓名”:“简”
},
{
“姓名”:“凯特”
}
]
},
{
“姓名”:“丽莎”,
“儿童”:[
{
“姓名”:“玛丽”
},
{
“姓名”:“大卫”
}
]
},
])
有没有办法查询所有名字中有某个子字符串的孩子

如果我想查询
'a'
它应该会得到
玛丽、大卫、凯特、简

我在想,也许

Family.query.filter(
Family.meta.contains([{“children”:[{“name”:func.contains(“a”)}]}])
)

诀窍是使用以下命令取消对一个或多个数组的测试,然后进行筛选:

meta_value = literal_column('meta.value', type_=JSONB)
children_value = literal_column('children.value', type_=JSONB)

Family.query.\
    with_entities(children_value['name'].astext).\
    select_from(
        Family,
        func.jsonb_array_elements(Family.meta).alias('meta'),
        func.jsonb_array_elements(
            meta_value['children']).alias('children')).\
    filter(children_value['name'].astext.contains('a'))
请注意使用来引用集合返回函数的值

另一个选项是使用
jsonb\u path\u query()
(在第12版中介绍):


例如,有调整,但如果您提供模型、您尝试过的内容等,则有助于提供答案。谢谢!我查看了它,但不确定它如何适应多个嵌套数组对象。我添加了一个虚拟模型,但我不认为它取决于模型的结构。
name = column('name', type_=JSONB)
Family.query.\
    with_entities(name.astext).\
    select_from(
        func.jsonb_path_query(
            Family.meta,
            '$[*].children[*].name').alias('name')).\
    filter(name.astext.contains('a')).\
    all()