非json可序列化-python+flask+sqlalchemy

bpsygsoo  于 2021-06-15  发布在  Mysql
关注(0)|答案(2)|浏览(551)

这个问题在这里已经有答案了

如何将sqlalchemy结果序列化为json(27个答案)
去年关门了。
我正在编写一个小查询,从中获取数据 mysql 数据库,我有一个报告表,里面有 report_id ,我需要查询匹配的数据 report_id 来自 api 参数。
我的职能:

def view_single_thumbnail(idx): // idx coming from params 
    session = Session()

    result = session.query(
        Report
    ).filter(
        Report.report_id == idx
    ).all()

    return jsonify({
        'data': result
    })

抛出错误: 'components.db.core.table_declaration.Report object at 0x000001C1Fsdfsdf51E6A90' is not JSON serializable .

nwsw7zdq

nwsw7zdq1#

查询的结果是一个对象如果我没记错的话,你应该把它转换成 dict 在尝试将其转换为json之前。我用了一个简单的 lambda 在一个老项目中做我的工作


# Lambda vesion

# row2dict = lambda r: {c.name: str(getattr(r, c.name)) for c in r.__table__.columns}

# Function version

def row2dict(row):
    return {
        c.name: str(getattr(row, c.name))
        for c in row.__table__.columns
    }

def view_single_thumbnail(idx): // idx coming from params 
    session = Session()

    result = [
           row2dict(report)
           for report in session.query(Report)
                  .filter(Report.report_id == idx)
                  .all()
    ]

    return jsonify({
        'data': result
    })
b5buobof

b5buobof2#

sqlalchemy对象不能由自动序列化 jsonify . 可以向sqlalchemy模型添加属性 class ```
class Report(db.Model):
def init(self):
...

@property
def serialized(self):
    """Return object data in serializeable format"""
    return {
        'id': self.id,
        'report_text': "Some text",
        ...
    }
您的视图将更新为:

def view_single_thumbnail(idx): // idx coming from params
session = Session()

result = session.query(
    Report
).filter(
    Report.report_id == idx
).all()

return jsonify({
    'data': [result.serialized for result in results]
})

相关问题