Python SQLAlchemy and Postgres – Cómo consultar un elemento JSON

Digamos que tengo una base de datos de Postgres (9.3) y hay una tabla llamada Resources . En la tabla de Resources tengo el id los campos que es un int y los data que es un tipo JSON.

Digamos que tengo los siguientes registros en dicha tabla.

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

Lo que quiero hacer es escribir una consulta que devuelva todos los registros en los que la columna de datos tenga un elemento json con el apellido igual a “Doe”

Intenté escribir algo como esto:

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

Sin embargo, Pycharm me está dando un error de comstackción en el “- >>”

¿Alguien sabe cómo escribiría la cláusula de filtro para hacer lo que necesito?

Intenta usar astext

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

Tenga en cuenta que la columna DEBE tener un tipo de JSONB. La columna JSON normal no funcionará.

También se puede convertir explícitamente la cadena a JSON (ver el documento de tipo JSON de Postgres ).

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

Según sqlalchemy.types.JSON , puedes hacerlo así

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