sqlalchemy转json的几种常用方式

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日

相关文章

  • 关于Java继承中父类和子类构造函数的问题

    关于Java继承中父类和子类构造函数的问题,可以从以下几个方面入手: 1. 构造函数的继承 继承是Java面向对象编程中一个很重要的概念,当子类继承一个父类时,它将会继承父类的所有字段和方法。但是,在Java中,子类并不会继承父类的构造函数,而是通过调用父类的构造函数,来完成子类对象的初始化。 子类调用父类构造函数的方法: public class Pare…

    other 2023年6月26日
    00
  • MySQL5.6.17数据库安装 如何配置My.ini文件

    MySQL5.6.17数据库安装如何配置My.ini文件 MySQL是一种开源的关系型数据库管理系统,很多网站和应用程序都需要用到它。在使用 MySQL5.6.17版本之前我们需要进行安装和配置,下面是MySQL5.6.17数据库的安装及配置My.ini文件的详细过程。 安装MySQL5.6.17 在 MySQL官网 下载 MySQL5.6.17的安装包,选…

    other 2023年6月25日
    00
  • Win11移动硬盘不显示怎么办?移动硬盘在电脑上显示不出来解决方法

    当移动硬盘在Win11电脑上插入后无法显示时,可以使用以下操作进行解决。 1. 检查移动硬盘连接 首先需要检查移动硬盘是否正确连接到电脑上。如果连接不良,可能导致电脑无法识别移动硬盘。 检查USB接口是否损坏或者松动,重插移动硬盘; 尝试使用其他USB接口连接移动硬盘; 检查移动硬盘是否供电正常。 2. 打开磁盘管理 如果移动硬盘仍然无法显示,可以尝试在Wi…

    other 2023年6月27日
    00
  • 苹果iOS9.2正式版固件下载汇总( 苹果iOS9.2 Beta4固件下载大全 )

    苹果iOS9.2正式版固件下载汇总 苹果iOS9.2正式版固件是苹果公司发布的最新操作系统版本。本攻略将详细介绍如何下载和安装iOS9.2正式版固件。同时,我们还提供了iOS9.2 Beta4固件下载的大全供您参考。 步骤一:备份数据 在开始下载和安装iOS9.2正式版固件之前,建议您先备份您的设备上的所有数据。这样可以确保您的数据在升级过程中不会丢失。您可…

    other 2023年8月4日
    00
  • shell中的replace

    Shell中的Replace 在Shell中,replace是一种常用的字符串操作,可以用于替换字符串中的指定字符或子串。本文将提供一个完整的攻略介绍Shell中的replace的基础知识,并提供两个示例说明。 Replace基础 replace的基础知识包括以下内容: 字符串替换:replace可以用于替换字符串中的指定字符或子串。可以以下语法: ${st…

    other 2023年5月8日
    00
  • 详解性能更优越的小程序图片懒加载方式

    以下是”详解性能更优越的小程序图片懒加载方式”的完整攻略: 懒加载方式的原理 懒加载是指在页面滚动时才去加载对应的图片,这样能够减少页面的加载时间,提升用户体验。在小程序中,懒加载的原理是通过监听页面滚动事件,判断图片是否在可视区域内,如果是,则去加载对应的图片。 基本实现方式 小程序里的图片组件是<image>,我们可以通过绑定<scro…

    other 2023年6月25日
    00
  • 网络安全渗透测试反序列化漏洞分析与复现工作

    很抱歉,由于当前平台的限制,我无法以标准的markdown格式文本回答您的问题。但是,我可以为您提供详细的攻略,包含两个示例说明。以下是关于网络安全渗透测试反序列化漏洞分析与复现工作的完整攻略: 1. 反序列化漏洞分析 反序列化漏洞是一种常见的安全漏洞,攻击者可以利用该漏洞执行恶意代码。以下是反序列化漏洞分析的步骤: 确定目标:选择要分析的应用程序或系统。 …

    other 2023年10月19日
    00
  • 解析Java实现设计模式六大原则之里氏替换原则

    解析Java实现设计模式六大原则之里氏替换原则 什么是里氏替换原则 里氏替换原则,简称LSP(Liskov Substitution Principle),是面向对象设计中非常重要的一条原则。它的定义如下:如果对于每个类型为S的对象o1,都有类型为T的对象o2,使得以T定义的所有程序P在所有对象o1都替换成o2时,程序P的行为没有发生变化,那么类型S是类型T…

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