Python SQLAlchemy и Postgres - как запросить элемент JSON

Скажем, у меня есть база данных Postgres (9.3), и есть таблица под названием Resources. В таблице Resources у меня есть поля id, которые являются int и data, которые являются типами JSON.

Скажем, у меня есть следующие записи в указанной таблице.

  • 1, {'firstname': 'Dave', 'lastname': 'Gallant'}
  • 2, {'firstname': 'John', 'lastname': 'Doe'}

Я хочу написать запрос, который будет возвращать все записи, в которых столбец данных имеет элемент json с последним именем, равным "Doe"

Я попытался написать что-то вроде этого:

records = db_session.query(Resource).filter(Resources.data->>'lastname' == "Doe").all()

Однако Pycharm дает мне ошибку компиляции на "- → "

Кто-нибудь знает, как я напишу условие фильтра, чтобы сделать то, что мне нужно?

Ответ 1

Попробуйте использовать astext

records = db_session.query(Resource).filter(
              Resources.data["lastname"].astext == "Doe"
          ).all()

Ответ 2

Также вы можете явно указать строку в JSON (см. Postgres JSON тип doc).

from sqlalchemy.dialects.postgres import JSON
from sqlalchemy.sql.expression import cast
db_session.query(Resource).filter(
    Resources.data["lastname"] == cast("Doe", JSON)
).all()

Ответ 3

В соответствии с sqlalchemy.types.JSON вы можете сделать это следующим образом

from sqlalchemy import JSON
from sqlalchemy import cast
records = db_session.query(Resource).filter(Resources.data["lastname"] == cast("Doe", JSON)).all()