example python json postgresql flask flask-sqlalchemy

example - sqlalchemy postgresql python



Usando el tipo JSON con Flask-sqlalchemy & Postgresql (1)

Antecedentes: estoy creando una aplicación Flask y he almacenado mis datos en una base de datos postgresql y dentro de un tipo de columna JSON.

Tarea: en mis funciones de vista, me gustaría ordenar una consulta de base de datos por {Clave: Valor} de la columna JSON

Realizado : He logrado realizar esta consulta en la línea de comandos de psql utilizando el siguiente comando, por ejemplo:

seleccione * desde el destino donde se emitió (producto - >> '''' ganancia ''como flotador)> 100 orden por orden (producto - >>'' ventas clasificadas ''como entero) asc;

Problema: no puedo replicar esta consulta en mi código (vea el código para el Modelo a continuación en la Sección de Información Extra)

from app import app, db from models import Target data = Target.query.order_by(Target.product[''salesrank''])

Error recibido : ProgrammingError: (ProgrammingError) no pudo identificar un operador de pedido para el tipo json LÍNEA 2: DESDE EL ORDEN POR OBJETIVO target.product -> ''salesrank'' ^ SUGERENCIA: use un operador de pedido explícito o modifique la consulta. ''SELECCIONE target.id AS target_id, target.store AS target_store, target.product AS target_product, target.asin AS target_asin, target.date AS target_date / nFROM target ORDER BY target.product ->% (product_1) s / n LIMIT% (param_1) s ''{'' product_1 '':'' salesrank '','' param_1 '': 1}

Información adicional Mi modelo de objetivo se configuró como tal:

#models.py from app import db from sqlalchemy.dialects.postgresql import JSON import datetime class Target(db.Model): __tablename__ = ''target'' id = db.Column(db.Integer) store = db.Column(db.String()) product = db.Column(JSON) asin = db.Column(db.String(), primary_key=True) date = db.Column(db.DateTime, default=datetime.datetime.utcnow())

Mi archivo App.py donde defino Flask y Sqlalchemy

from flask import Flask import os from flask.ext.sqlalchemy import SQLAlchemy from flask_bootstrap import Bootstrap app = Flask(__name__) app.config.from_object(os.environ[''APP_SETTINGS'']) db = SQLAlchemy(app) Bootstrap(app) import views from app import app from models import Result if __name__ == ''__main__'': app.run(host=''192.168.1.5'', port=5000, debug=True)

¡Gracias por cualquier ayuda que pueda proporcionar!


Mirando la documentación de SQLAlchemy para el tipo de datos JSON , parece que debería poder usar el método .cast :

from sqlalchemy.types import Integer from app import app, db from models import Target # SQLAlchemy 1.1+ data = Target.query.order_by(Target.product[''salesrank''].astext.cast(Integer)) # SQLAlchemy < 1 data = Target.query.order_by(Target.product[''salesrank''].cast(Integer))