使用带有Flask-sqlalchemy&的JSON类型PostgreSQL的

时间:2014-05-26 21:39:49

标签: python json postgresql flask flask-sqlalchemy

后台:我正在构建Flask应用程序,并且已将数据存储到postgresql数据库和JSON列类型中。

任务:在我的视图函数中,我想从JSON列的{Key:Value}订购数据库查询

完成:我已成功通过使用以下命令在psql命令行执行此查询,例如:

从目标转换中选择*(产品 - >>'利润'浮动)>由cast(产品 - >>>' salesrank'为整数)asc组成的100个订单;

问题:我无法在我的代码中复制此查询(请参阅下方“额外信息”部分中的模型代码)

from app import app, db
from models import Target 

data = Target.query.order_by(Target.product['salesrank'])

收到错误 - ProgrammingError :( ProgrammingError)无法识别json类型的排序运算符 第2行:FROM target ORDER BY target.product - > ' salesrank'                              ^ 提示:使用显式排序运算符或修改查询。  ' 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}

额外信息 我的目标模型设置如下:

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

我的App.py文件,我定义了Flask和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)

感谢您提供任何帮助!

1 个答案:

答案 0 :(得分:20)

查看the SQLAlchemy documentation for the JSON data type您似乎可以使用.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))