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))