Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/359.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在PostgreSQL JSON字段中选择JSON数组中包含给定值的记录?_Python_Json_Postgresql_Sqlalchemy_Flask Sqlalchemy - Fatal编程技术网

Python 如何使用SQLAlchemy在PostgreSQL JSON字段中选择JSON数组中包含给定值的记录?

Python 如何使用SQLAlchemy在PostgreSQL JSON字段中选择JSON数组中包含给定值的记录?,python,json,postgresql,sqlalchemy,flask-sqlalchemy,Python,Json,Postgresql,Sqlalchemy,Flask Sqlalchemy,我在PostgeSQL数据库中有一些项目(用户),其中包含JSONdata字段,其结构如下: { "department": [ "IT" ], "competencies": [ "moderator", "language_ru", "language_en" ] } 数据库是使用Alchemy访问的 from sqlalchemy.dialects.postgresql import JSON class UserDBO(db.Model

我在PostgeSQL数据库中有一些项目(用户),其中包含JSON
data
字段,其结构如下:

{
  "department": [
    "IT"
  ],
  "competencies": [
    "moderator",
    "language_ru",
    "language_en"
  ]
}
数据库是使用Alchemy访问的

from sqlalchemy.dialects.postgresql import JSON

class UserDBO(db.Model):
    __tablename__ = 'user'
    id = db.Column(db.BigInteger, primary_key=True)
    display_name = db.Column(db.String(length=100), index=True),
    email = db.Column(db.String(length=254), index=True)
    phone = db.Column(db.String(length=16), index=True)
    created = db.Column(db.DateTime)
    data = db.Column(JSON, default={}, nullable=False)
我需要选择具有特定能力的用户。 我尝试了以下用于sqlalchemy查询的过滤器(没有一个按预期工作,大多数返回错误):

我需要在UserDBO.data['capabilities']中选择与多个能力相匹配的项目,如
['版主','language\u en']

使用一些过滤器(如UserDBO中的
“版主”)逐个选择他们。对于一个能力,数据['competencies']
也可以

通过创建适当的索引来优化这样的查询也是非常有趣的

from sqlalchemy.types import Unicode, String
from sqlalchemy import cast
from sqlalchemy import func
from sqlalchemy.dialects import postgresql
records = UserDBO.query.filter(
            # func.json_contains(UserDBO.data['competencies'],cast('moderator', String)),
            # UserDBO.data['competencies'].contains({'competencies':['moderator']}),
            # UserDBO.data['competencies'].contains('moderator')
            # UserDBO.data['competencies'].astext.cast(Unicode) == 'moderator',
            # UserDBO.data['competencies'] == ['moderator'],
            # ['moderator'] in UserDBO.data['competencies'],
            # ['moderator'] in UserDBO.data['competencies'],
            # UserDBO.data['competencies'] == cast('moderator', Unicode),
        )