加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

使用postgresql从Flask-SQLAlchemy中的JSON字段查询值

发布时间:2020-12-13 16:03:12 所属栏目:百科 来源:网络整理
导读:我正在使用带有 JSON字段类型的Flask,SQLAlchemy和postgresql. 我在使用SQLAlchemy查询数据时遇到问题 这是我的模型示例: class WorkQueue(db.Model): __tablename__ = "workQueue" id = db.Column(db.Integer,primary_key=True) field_data = db.Column(JS
我正在使用带有 JSON字段类型的Flask,SQLAlchemy和postgresql.
我在使用SQLAlchemy查询数据时遇到问题

这是我的模型示例:

class WorkQueue(db.Model):
    __tablename__ = "workQueue"

    id = db.Column(db.Integer,primary_key=True)
    field_data = db.Column(JSON)

    def __init__(self,field_data = None):
        self.field_data = field_data

这是我提交给数据库的数据集的示例

{
    "files": 
    [
        {
            "added": 1470248644.093014,"totalbytes": 1109630458,"filename": "/home/me/project/static/uploads/file.ext","finished": false,"basefilename": "file.ext","file_id": 21,"numsegments": 2792
        }
     ],"numfiles": 1,"success": true
}

我有问题查询 – 尝试从定义如此的路线中找到“WorkQueue [‘files’] [0] [‘file_id’]”:

@page.route('/remove/<int:id>',methods=['GET','POST'])
def file_remove(id):
    to_remove = id

    # here is where I would query and delete,but I can't get this right

从psql它将是这样的:

select * from "workQueue" t,json_array_elements(t.field_data->'files') as files WHERE CAST(files->>'file_id' AS INTEGER) = 1;

似乎无法在SQLAlchemy中复制它

解决方法

这样的事情

from sqlalchemy import func,Integer

files_subquery = session.query(func.json_array_elements(WorkQueue.field_data['files']).label('files')) 
                        .subquery()
query = session.query(WorkQueue.id,WorkQueue.field_data,files_subquery.c.files) 
               .filter(files_subquery.c.files.op('->>')('file_id').cast(Integer) == 1)

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读