web-dev-qa-db-ja.com

Flask-sqlalchemyおよびPostgresqlでJSONタイプを使用する

背景:私はFlaskアプリを構築しており、postgresqlデータベースとJSON列タイプ内にデータを保存しました。

タスク:私のビュー関数では、JSON列の{Key:Value}でデータベースクエリを並べたい

Accomplished:次のコマンドを使用して、psqlコマンドラインでこのクエリを実行することに成功しました。

*キャスト(製品->> '利益'フロートとして)>キャスト(製品->> 'セールスランク'整数として)ascで100個のターゲットから選択します。

問題:コード内でこのクエリを複製できません(下記の「追加情報」セクションのモデルのコードを参照)

from app import app, db
from models import Target 

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

受信したエラー-ProgrammingError:(ProgrammingError)はjson LINE型の順序演算子を識別できませんでした:FROM target ORDER BY target.product-> 'salesrank' ^ヒント:明示的な順序演算子を使用するか、クエリ。 '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ターゲット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 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)

あなたが提供できる助けをありがとう!

26
larrywgray

JSONデータ型のSQLAlchemyドキュメント を見ると、.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))
21
Sean Vieira