У меня есть элементы (пользователи) в базе данных Postge SQL с полем JSON data
с такой структурой:
{
"department": [
"IT"
],
"competencies": [
"moderator",
"language_ru",
"language_en"
]
}
Доступ к базе данных осуществляется с помощью flask -sqlalchemy.
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 (ни один из них не работал должным образом, большинство возвращало ошибок):
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),
)
Мне нужно выбрать элементы, соответствующие нескольким компетенциям, например ['moderator','language_en'] in UserDBO.data['competencies']
.
Можно также выбрать их по одному с помощью некоторого фильтра, например 'moderator' in UserDBO.data['competencies']
для одной компетенции.
Также будет очень интересно оптимизировать такой запрос, создав соответствующие индексы.