在Flask-sqlalchemy与Postgresql中使用JSON类型

35 投票
1 回答
50191 浏览
提问于 2025-04-18 07:38

背景: 我正在构建一个Flask应用程序,并将我的数据存储在PostgreSQL数据库中,数据类型为JSON。

任务: 在我的视图函数中,我想根据JSON列中的{键:值}来排序数据库查询。

完成情况: 我已经成功地在psql命令行中执行了这个查询,举个例子,我使用了以下命令:

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

问题: 我无法在我的代码中复制这个查询(请参见额外信息部分的模型代码)

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
FROM target ORDER BY target.product -> %(product_1)s
LIMIT %(param_1)s' {'product_1': 'salesrank', 'param_1': 1}

额外信息
我的Target模型是这样设置的:

#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 个回答

29

在查看SQLAlchemy关于JSON数据类型的文档时,似乎你应该可以使用.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))

撰写回答