Как переписать мой SQL запрос на языке ORM sqlalchemy?

Привет! У меня есть запрос к БД, который хочу переписать для работы на бекенде с использованием SQLAlchemy. Не могу найти информацию о том, как обозначаются операторы ->, ->> и ::json в SQLAlchemy. Буду благодарен за помощь или ссылки на соответствующий раздел документации.

Мой текущий вариант запроса выдает значения None для всех полей, хотя я указал, что хочу получить только те, где значение поля genre[0]['name'] равно 'Action'.

Вот мой текущий код:
query = select(game_table.c.genre[0]['name']).filter(cast(game_table.c.genre[0]['name'], Text) == 'Action').limit(10)
result = await db.execute(query)

Использую СУБД PostgreSQL 15.
  • 13 октября 2023 г. 9:50
Ответы на вопрос 1
Для работы с JSONB-полями в PostgreSQL с использованием SQLAlchemy можно использовать функцию `op` и метод `astext`. Вот как можно переписать ваш запрос:

from sqlalchemy.sql import func
from sqlalchemy.dialects.postgresql import JSONB
from sqlalchemy import text

query = select(func.op('->')(game_table.c.genre, '0')['name']).\
        filter(func.cast(func.op('->>')(game_table.c.genre, '0')['name'], JSONB).astext == 'Action').\
        limit(10)

result = await db.execute(query)

Это использует `func.op` для обращения к операторам JSONB `->` и `->>`, а также `func.cast` для преобразования значения в поле JSONB в текст для сравнения с 'Action'. Код `astext` используется для выполнения преобразования к типу `Text` в SQLAlchemy.

Не забудьте импортировать нужные классы и функции из SQLAlchemy, чтобы код работал. Надеюсь, это поможет!
Похожие вопросы