Как запросить массив JSON в Postgres с помощью SqlAlchemy?

У меня определена модель SqlAlchemy

from sqlalchemy.dialects.postgresql import JSONB

class User(db.Model):
    __tablename__ = "user"
    id = db.Column(db.Integer, primary_key=True)
    nickname = db.Column(db.String(255), nullable=False)
    city = db.Column(db.String(255))
    contact_list = db.Column(JSONB)
    created_at = db.Column(db.DateTime, default=datetime.utcnow)

def add_user():
    user = User(nickname="Mike")
    user.contact_list = [{"name": "Sam", "phone": ["123456", "654321"]}, 
                         {"name": "John", "phone": ["159753"]},
                         {"name": "Joe", "phone": ["147889", "98741"]}]
    db.session.add(user)
    db.session.commit()

if __name__ == "__main__":
    add_user()

Как я могу получить имя из моего списка контактов , используя телефон ? Например, у меня есть 147889 , как я могу получить Джо ?

Я пробовал это

User.query.filter(User.contact_list.contains({"phone": ["147889"]})).all()

Но он возвращает мне пустой список, []

Как я могу это сделать?

4 голоса | спросил tahmid.choyon 5 thEurope/Moscowp30Europe/Moscow09bEurope/MoscowWed, 05 Sep 2018 19:54:53 +0300 2018, 19:54:53

1 ответ


0
Вы просто забыли, что ваш JSON-путь должен включать и внешний массив:вернет пользователя, которого вы ищете.Исходный запрос будет соответствовать, если ваш JSON содержит объект с ключом «телефон» и т. Д. Обратите внимание, что при этом возвращается рассматриваемый объект ---- +: = 1 =: + ---- , а не конкретный объект /имя изструктура JSON.Если вы хотите, чтобы это, как кажется, являлось конечной целью, вы могли бы расширить элементы массива каждого пользователя, отфильтровать их по полученным записям и выбрать имя:С другой стороны, приведенный выше запрос не так удобен для индексов, как первый, поскольку он должен расширять все массивы перед фильтрацией, поэтому может быть полезно сначала найти пользователей, которые содержат телефон, в списке контактов вподзапрос или CTE, а затем разверните и отфильтруйте.
ответил Ilja Everilä 5 thEurope/Moscowp30Europe/Moscow09bEurope/MoscowWed, 05 Sep 2018 20:06:36 +0300 2018, 20:06:36

Похожие вопросы

Популярные теги

security × 330linux × 316macos × 2827 × 268performance × 244command-line × 241sql-server × 235joomla-3.x × 222java × 189c++ × 186windows × 180cisco × 168bash × 158c# × 142gmail × 139arduino-uno × 139javascript × 134ssh × 133seo × 132mysql × 132