sqlalchemy转json的几种常用方式

yizhihongxing

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技术站

(0)
上一篇 2023年3月29日
下一篇 2023年3月29日

相关文章

  • KMPlayer播放器怎么自制自定义电影缩略图?

    KMPlayer是一款免费的多媒体播放器,它提供了丰富的视频播放功能和自定义选项。其中之一就是自定义电影缩略图。下面是自制自定义电影缩略图的完整攻略: 步骤一:准备缩略图图片 在自制电影缩略图之前,需要先准备好缩略图图片。图片的格式可以是JPG、PNG或BMP等。图片的尺寸可以根据自己的需要调整,但建议不要太大,以免影响播放器的运行速度。 示例:假设我要为电…

    other 2023年6月25日
    00
  • 魔兽世界6.0熊德属性优先级 各属性收益详解

    魔兽世界6.0熊德属性优先级 各属性收益详解 介绍 此攻略介绍了熊德在魔兽世界6.0版本中,属性的优先级以及各属性的收益详情,以帮助玩家更好地理解熊德的玩法特点。 属性优先级说明 熊德在魔兽世界6.0版本中,属性的优先级如下: 橙色攻击力(极长牙):提高熊德的输出伤害,建议优先提高; 精通:提高熊德的技能伤害和治疗效果,为次要属性; 暴击:提高熊德技能的暴击…

    other 2023年6月27日
    00
  • Win11 Build 2262x.1470今日发布(附KB5023780更新内容汇总)

    Win11 Build 2262x.1470今日发布(附KB5023780更新内容汇总)攻略 今天,Win11 Build 2262x.1470发布了,这是一次重要的更新。本攻略将详细介绍如何安装和使用这个版本,并提供KB5023780更新内容的汇总。 安装Win11 Build 2262x.1470 首先,确保你的计算机符合Win11的系统要求。这包括64…

    other 2023年8月3日
    00
  • 如何理解Java中基类子对象的构建过程从”基类向外”进行扩散的?

    在Java中,当我们创建一个派生类的对象时,它的基类子对象也会被构建。基类子对象构建的过程是从基类像外扩散的,也就是说,先构建基类,再构建派生类。 具体来说,当我们创建一个派生类的对象时,Java会先调用基类的构造器来构建基类子对象,然后调用派生类的构造器来构建自身的成员变量和方法。因此,在派生类中可以使用基类的成员变量和方法,因为基类子对象已经构建完成了。…

    other 2023年6月27日
    00
  • 关于SQL Server中bit类型字段增删查改的一些事

    关于SQL Server中bit类型字段增删查改的一些事 1. 什么是bit类型字段 bit类型字段也称作布尔型,它只有两个取值,0或1,代表真或假,可以用于存储逻辑值。 2. bit类型字段的数据类型 在SQL Server中,bit类型字段属于数据类型的一种,可通过以下语法来声明bit类型字段: ColumnName bit [DEFAULT 0/1] …

    other 2023年6月25日
    00
  • 解决firefox不支持-webkit-line-clamp属性

    解决Firefox不支持-webkit-line-clamp属性 在网页设计中,为了美观和易读性,经常需要对文本进行截取或折叠显示。这时我们可以使用 text-overflow 和 line-clamp 属性来实现。比如,使用 line-clamp 属性可以限制文本行数并折叠多余部分。 但是,line-clamp 属性只在 WebKit 内核的浏览器中才被支…

    其他 2023年3月28日
    00
  • 关于工伤事故索赔计算很好用的一款APP

    关于工伤事故索赔计算很好用的一款APP 如果您是一名企业主或员工,工伤事故索赔可能是您关注的一个重要问题。在处理工伤索赔时,听说有一款名为工伤事故索赔计算的APP非常有用,那么它有哪些特点呢? 功能介绍 这款工伤事故索赔计算APP的主要功能如下: 帮助用户计算工伤事故索赔赔偿额度 根据不同类型的工伤事故,提供不同的计算公式 提供现行相关法律法规的查询服务 支…

    其他 2023年3月28日
    00
  • Vue按需加载的具体实现

    Vue按需加载其实就是指在Vue项目中,将一些不常用的组件或者路由异步加载,可以提高页面的加载速度和性能。 具体实现步骤如下: 安装babel-plugin-component插件 npm install babel-plugin-component –save-dev 修改babel配置 在项目根目录下创建.babelrc文件,并添加以下内容: { &q…

    other 2023年6月25日
    00
合作推广
合作推广
分享本页
返回顶部