为什么在将棉花糖与SQLAlchemy自动映射一起使用时,为什么“ Decimal类型的对象不可JSON序列化”?

时间:2019-06-12 10:18:17

标签: python-3.x flask-sqlalchemy marshmallow

使用automap_base中的sqlalchemy.ext.automap映射我的表格。 无法shema.dumps(result)

获取

raise TypeError(f'Object of type {o.__class__.__name__} '
TypeError: Object of type Decimal is not JSON serializable

尝试使用JSON自定义解码器,但没有用。

from flask import Flask
from flask_sqlalchemy import SQLAlchemy
from sqlalchemy.orm import Session
from sqlalchemy.ext.automap import automap_base
from flask_marshmallow import Marshmallow

app = Flask(__name__)
app.config['SQLALCHEMY_DATABASE_URI'] = 'sqlite:///database.db'

db = SQLAlchemy(app)
ma = Marshmallow(app)

engine = db.engine
session = Session(engine)

Base = automap_base()
Base.prepare(engine, reflect=True)

MyTable = Base.classes.my_table

class MyTableSchema(ma.ModelSchema):
    class Meta:
        model = MyTable

@app.route("/")
def api():
    all_rows = session.query(MyTable).all()
    schema = MyTableSchema(many=True)
    response = schema.dumps(all_rows)

    return response

if __name__ == '__main__':
    app.run(debug=True)

2 个答案:

答案 0 :(得分:1)

transformSQLAlchemy result对象JSON的一种简单的解决方法是使用simplejson

您只需要导入(import simplejson)即可。

使用您的示例:

import simplejson
...
@app.route("/")
def api():
    all_rows = session.query(MyTable).all()
    response = simplejson.dumps(all_rows)

答案 1 :(得分:0)

将 .data 添加到响应中,如下所示

def api():
    all_rows = session.query(MyTable).all()
    schema = MyTableSchema(many=True)
    response = schema.dumps(all_rows)

    return response.data