SQLAlchemy转JSON的几种常用方式
在Web开发中,我们通常需要将从数据库中查询到的数据以JSON格式返回给客户端浏览器,这样便于前端开发使用。而在使用Python后台框架Flask和Django等时,查询数据的第一步就是使用ORM框架进行操作,其中SQLAlchemy是一种常用的ORM框架。
那么,如何使用SQLAlchemy将查询到的数据转换为JSON格式呢?接下来将介绍几种常用方式。
使用字典
SQLAlchemy查询到的数据是一个Python对象,我们可以将其转换为字典并使用Python的JSON库将字典序列化为JSON格式。
from flask import jsonify
from myapp import db, User
users = User.query.all()
user_list = []
for user in users:
user_dict = {'id': user.id, 'name': user.name, 'age': user.age}
user_list.append(user_dict)
return jsonify({'users': user_list})
这种方法比较直观,但是如果表结构比较复杂,会导致这种转换过程比较繁琐。
使用SerializationMixin
SQLAlchemy提供了一个名为SerializationMixin
的Mixin类,可以将模型对象转换为字典,从而进行序列化。
from flask import jsonify
from myapp import db, User
from sqlalchemy.ext.declarative import declared_attr
class BaseMixin(object):
@declared_attr
def __tablename__(cls):
return cls.__name__.lower()
def to_dict(self):
return {c.name: getattr(self, c.name, None) for c in self.__table__.columns}
class User(db.Model, BaseMixin):
id = db.Column(db.Integer, primary_key=True)
name = db.Column(db.String(64))
age = db.Column(db.Integer)
def __repr__(self):
return f'<User {self.name}>'
users = User.query.all()
return jsonify({'users': [u.to_dict() for u in users]})
使用SerializationMixin
可以避免手动创建字典,但是需要每个模型都添加相同的to_dict
方法,比较繁琐。
使用Flask扩展库flask-restful
如果我们是使用Flask框架,可以使用Flask扩展库flask-restful提供的marshal_with
装饰器和fields
对象,可以更为方便地将查询到的数据转换为JSON格式返回。
from flask import Flask
from flask_marshmallow import Marshmallow
from flask_restful import Resource, Api, fields, marshal_with
from myapp import db, User
app = Flask(__name__)
ma = Marshmallow(app)
api = Api(app)
class UserSchema(ma.SQLAlchemySchema):
class Meta:
model = User
id = fields.Integer(dump_only=True)
name = fields.String(required=True)
age = fields.Integer(required=True)
user_schema = UserSchema()
users_schema = UserSchema(many=True)
class UserResource(Resource):
@marshal_with(user_schema)
def get(self, user_id):
user = User.query.get_or_404(user_id)
return user
class UsersResource(Resource):
@marshal_with(users_schema)
def get(self):
users = User.query.all()
return users
api.add_resource(UserResource, '/users/<int:user_id>')
api.add_resource(UsersResource, '/users')
if __name__ == '__main__':
app.run(debug=True)
使用flask-restful
可以更加方便地将数据转换为JSON格式,同时也支持单个对象和列表对象的序列化返回。
总结
本文介绍了使用SQLAlchemy转JSON的几种常用方式,每种方式都有其适用场景,根据项目的实际需求可以选择不同的方法进行序列化。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:sqlalchemy转json的几种常用方式 - Python技术站