Background: I am building a Flask App and I have stored my data into a postgresql database and within a JSON column type.
Task: In my view functions, I would like to order a database query by {Key:Value} from JSON column
Accomplished: I have been successful in performing this query at the psql command-line by using the following command for example:
select * from target where cast(product->>'profit' as float) > 100 order by cast(product->>'salesrank' as integer) asc;
Problem: I can not replicate this query in my code (see code for Model below in Extra Info Section)
from app import app, db from models import Target data = Target.query.order_by(Target.product['salesrank'])
Error received - ProgrammingError: (ProgrammingError) could not identify an ordering operator for type json LINE 2: FROM target ORDER BY target.product -> 'salesrank' ^ HINT: Use an explicit ordering operator or modify the query. 'SELECT 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}
Extra Info My Target model was set up as such:
#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())
My App.py file where I define Flask and 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)
Thank you for any help you can provide!
SQLAlchemy supports JSON fields natively so you can easily add support for them in your ORM models.
Flask-SQLAlchemy is a Flask extension that makes using SQLAlchemy with Flask easier, providing you tools and methods to interact with your database in your Flask applications through SQLAlchemy. In this tutorial, you'll build a small student management system that demonstrates how to use the Flask-SQLAlchemy extension.
One of which is that Flask-SQLAlchemy has its own API. This adds complexity by having its different methods for ORM queries and models separate from the SQLAlchemy API. Another disadvantage is that Flask-SQLAlchemy makes using the database outside of a Flask context difficult.
PickleType. Holds Python objects, which are serialized using pickle.
Looking at the SQLAlchemy documentation for the JSON data type it appears that you should be able to use the .cast
method:
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))
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With