flask-sqlalchemy输出json格式数据

flask-sqlalchemy查询数据:

user = db.session.execute(db.select(User).filter_by(username=username)).scalar_one()

users = db.session.execute(db.select(User).order_by(User.username)).scalars()

注意:根据官网文档,已经不推荐使用下面的方法来查询数据。

User.query.all() 

查询所得的user为User类型,users则为User类型的集合,无法直接return给前端,需要进行格式化。网上一般会推荐使用json.dump()或者jsonify()来序列化数据,但对于sqlalchemy的对象并不适用。

json.dumps(users)
或者
jsonify(users)

都会出现错误:Object of type ScalarResult is not JSON serializable

这个问题可以通过增加两个函数来处理:

#将单个数据转为dict
def model_to_dict(object):
    return {c.name: getattr(object, c.name) for c in object.__table__.columns}

#将一组数据转为list
def scalars_to_list(object):
    return [model_to_dict(c) for c in object]

下面是一个事例代码片段:

@app.route('/')
def index():
    users=db.session.execute(db.select(User)).scalars()
    #user=db.session.execute(db.select(User)).scalar()
    ret = scalars_to_list(users)
    #ret = model_to_dict(user)
    return ret
    #return json.dumps(ret)

输出JSON可能会遇到中文乱码的问题,可以尝试修改Flask的配置解决:

#解决中文乱码的问题,将json数据内的中文正常显示
app.config['JSON_AS_ASCII'] = False

  • 3
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值