Использование типа JSON с Flask-sqlalchemy & Postgresql

16

Фон: Я создаю приложение Flask, и я сохранил свои данные в базе данных postgresql и в столбце типа JSON.

Задача: В моих функциях просмотра я хотел бы заказать запрос базы данных по {Ключ: Значение} из столбца JSON

Выполнено. Мне удалось выполнить этот запрос в командной строке psql, используя следующую команду:

выберите * from target, где 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 LINE 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, где я определяю флажок и 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)

Спасибо за любую помощь, которую вы можете предоставить!

  • 0
    хотя немного не связано. У меня проблемы с JSON, но не с запросами, а с начальной вставкой данных. Знаете ли вы, как вы вставили данные в поле JSON. см мой вопрос для более подробной информации. stackoverflow.com/questions/55628358/...
Теги:
flask
flask-sqlalchemy

1 ответ

12
Лучший ответ

Глядя на документацию SQLAlchemy для типа данных JSON, вы должны иметь возможность использовать метод .cast:

from sqlalchemy.types import Integer

from app import app, db
from models import Target 

data = Target.query.order_by(Target.product['salesrank'].cast(Integer))
  • 0
    Я сталкивался с этим в документации, пытался сделать это несколько раз, но получил только неизвестную ошибку «Integer» - теперь я понял, что мне просто нужно импортировать INTEGER из sqlalchemy.dialects.postgresql, чтобы он работал. Правильный код:
  • 0
    или Integer из sqlalchemy.types, как вы предложили, чтобы заставить его работать.
Показать ещё 2 комментария

Ещё вопросы

Сообщество Overcoder
Наверх
Меню