Ответ 1
Попробуйте использовать astext
records = db_session.query(Resource).filter(
Resources.data["lastname"].astext == "Doe"
).all()
Скажем, у меня есть база данных Postgres (9.3), и есть таблица под названием Resources
. В таблице Resources
у меня есть поля id
, которые являются int и data
, которые являются типами JSON.
Скажем, у меня есть следующие записи в указанной таблице.
Я хочу написать запрос, который будет возвращать все записи, в которых столбец данных имеет элемент json с последним именем, равным "Doe"
Я попытался написать что-то вроде этого:
records = db_session.query(Resource).filter(Resources.data->>'lastname' == "Doe").all()
Однако Pycharm дает мне ошибку компиляции на "- → "
Кто-нибудь знает, как я напишу условие фильтра, чтобы сделать то, что мне нужно?
Попробуйте использовать astext
records = db_session.query(Resource).filter(
Resources.data["lastname"].astext == "Doe"
).all()
Также вы можете явно указать строку в 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()
В соответствии с sqlalchemy.types.JSON вы можете сделать это следующим образом
from sqlalchemy import JSON
from sqlalchemy import cast
records = db_session.query(Resource).filter(Resources.data["lastname"] == cast("Doe", JSON)).all()