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