Background:我正在构建一个Flask应用程序,我已经将数据存储到postgresql数据库中,并存储在JSON列类型中.

Task:在我的视图函数中,我想从JSON列按{Key:Value}排序一个数据库查询

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

select * from target where cast(product->>'profit' as float) > 100 order by cast(product->>'salesrank' as integer) asc;

Problem:我无法在代码(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

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

我的apply.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)

Thank you for any help you can provide!

推荐答案

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

Postgresql相关问答推荐

跟踪状态更改为特定值的日期

PostgreSQL(container)中使用80K子分区表处理共享内存不足错误

正在应用序列化迁移,但数据库没有更改

为什么32632投影中的几何图形并不完美?

如何在 sequelize 使用 db postgres 中通过外键更新记录和更新包含许多记录关系

我在try 访问我的数据库表时在 postgresql 中收到 aclcheck_error 错误

Postgres 唯一 JSON 数组聚合值

Heroku Rails 4 无法连接到服务器:connection refused

postgresql 更新错误ERROR: invalid input syntax for type boolean:

Postgres中的GROUP BY - JSON数据类型不相等?

postgres 和 python

knex: Select 特定日期范围内的行

如何将 DELETE 的返回值插入到 postgresql 中的 INSERT 中?

在 Spring Boot 上使用 Hibernate 映射 PostGIS 几何点字段

PostgreSQL CASE 在函数中的使用

我怎样才能知道 Postgresql 表空间中有什么?

SqlAlchemy:多列的不同计数

Postgresql - 更新规则 - 可能有一个最后修改日期,自动更新该行的on update?

带有 WITH 子句的查询时出现 Postgresmissing FROM-clause entry错误

如何更改 PostgreSQL 中的日期样式?