博客
关于我
Flask 实现 Rest API (04) - 基于Flask-SqlAlchemy将查询结果转换为json
阅读量:687 次
发布时间:2019-03-17

本文共 3443 字,大约阅读时间需要 11 分钟。

文章简介:本文介绍了如何将基于 Flask-SQLAlchemy 归档查询结果转换为 JSON 格式。通过手动映射、通用基类以及 Flask-Marshmallow 模块等多种方法详细说明实现过程。

在这篇文章中,我们将深入探讨如何将基于 Flask-SQLAlchemy 的查询结果转换为 JSON 格式。以下几种方法将为您提供实用的解决方案。

方法一:手动映射字段

如果您不想使用第三方模块,手动编写代码也是可行的。以下是一个通用的实现方法。

  • 创建一个基类,提供通用的 JSON 转换功能。
  • class EntityBase(object):    def to_json(self):        fields = self.__dict__        if "_sa_instance_state" in fields:            del fields["_sa_instance_state"]        return fields

    注意:请确保在 Model 类中继承 EntityBase 基类。

    1. 定义 User 模型并继承 EntityBase。
    2. class User(db.Model, EntityBase):    __tablename__ = 'user'    USER_ID = db.Column(db.Integer, primary_key=True)    USERNAME = db.Column(db.String(20), nullable=False)    CREATED_BY = db.Column(db.String(20), nullable=False)    CREATED_DATE = db.Column(db.Date, nullable=False)
      1. 在路由中实现 JSON 转换。
      2. @app.route('/users')def list_users():    users = User.query.all()    users_output = []    for user in users:        users_output.append(user.to_json())    return jsonify(users_output)@app.route('/users/
        ')def find_user(userid): user = User.query.get(userid) return jsonify(user.to_json())

        方法二:使用 Flask-Marshmallow

        Flask-Marshmallow 提供了更方便的方法来实现数据序列化。

      3. 安装 Flask-Marshmallow 并初始化。
      4. from flask_marshmallow import Marshmallowma = Marshmallow(app)
        1. 定义一个 Schema 类。
        2. class UserSchema(ma.ModelSchema):    class Meta:        model = User
          1. 优化后的路由实现。
          2. @app.route('/users')def list_users():    users = User.query.all()    user_schema = UserSchema(many=True)    user_data = user_schema.dump(users)    return jsonify(user_data)@app.route('/users/
            ')def find_user(userid): user = User.query.get(userid) user_schema = UserSchema() user_data = user_schema.dump(user) return jsonify(user_data)

            动态字段映射

            Flask-SQLAlchemy 提供了一个动态的方法来自动映射字段。如果您的字段名和数据库字段名一致,可以利用这一特性无需手动指定字段。

            class User(db.Model):    __tablename__ = 'user'    USER_ID = db.Column(db.Integer, primary_key=True)    USERNAME = db.Column(db.String(20), nullable=False)@app.route('/users')def list_users():    users = User.query.all()    return jsonify([{"USER_ID": user.USER_ID, "USERNAME": user.USERNAME} for user in users])

            注意事项

          3. 如果您使用了 SQLAlchemy 的关系字段(如 SQLAlchemy_relationship),可以确保 __dict__ 对应的字段包含相关信息。
          4. 强烈推荐使用 Flask-Marshmallow 以提升代码的可维护性和扩展性。
          5. 完整源代码示例

            from flask import Flask, jsonifyfrom flask_sqlalchemy import SQLAlchemyfrom flask_marshmallow import Marshmallowapp = Flask(__name__)app.config['SECRET_KEY'] = 'your-secret-key-here'app.config['SQLALCHEMY_DATABASE_URI'] = 'sqlite:///database.db'app.config['SQLALCHEMY_TRACK_MODIFICATIONS'] = Falseapp.config['JSON_SORT_KEYS'] = Falsedb = SQLAlchemy(app)ma = Marshmallow(app)class User(db.Model):    __tablename__ = 'user'    USER_ID = db.Column(db.Integer, primary_key=True)    USERNAME = db.Column(db.String(20), nullable=False)    CREATED_BY = db.Column(db.String(20), nullable=False)    CREATED_DATE = db.Column(db.Date, nullable=False)class UserSchema(ma.ModelSchema):    class Meta:        model = User@app.route('/users')def list_users():    users = User.query.all()    user_schema = UserSchema(many=True)    user_data = user_schema.dump(users)    return jsonify(user_data)@app.route('/users/
            ')def find_user(userid): user = User.query.get(userid) user_schema = UserSchema() user_data = user_schema.dump(user) return jsonify(user_data)if __name__ == "__main__": app.run(debug=True)

            以上方法均可实现将基于 Flask-SQLAlchemy 的查询结果转换为 JSON 格式的功能。您可以根据实际需求选择最适合的方法,并根据项目复杂度进行优化和扩展。

    转载地址:http://sbthz.baihongyu.com/

    你可能感兴趣的文章
    MySQL 中锁的面试题总结
    查看>>
    MySQL 中随机抽样:order by rand limit 的替代方案
    查看>>
    MySQL 为什么需要两阶段提交?
    查看>>
    mysql 为某个字段的值加前缀、去掉前缀
    查看>>
    mysql 主从
    查看>>
    mysql 主从 lock_mysql 主从同步权限mysql 行锁的实现
    查看>>
    mysql 主从互备份_mysql互为主从实战设置详解及自动化备份(Centos7.2)
    查看>>
    mysql 主从关系切换
    查看>>
    MYSQL 主从同步文档的大坑
    查看>>
    mysql 主键重复则覆盖_数据库主键不能重复
    查看>>
    Mysql 事务知识点与优化建议
    查看>>
    Mysql 优化 or
    查看>>
    mysql 优化器 key_mysql – 选择*和查询优化器
    查看>>
    MySQL 优化:Explain 执行计划详解
    查看>>
    Mysql 会导致锁表的语法
    查看>>
    mysql 使用sql文件恢复数据库
    查看>>
    mysql 修改默认字符集为utf8
    查看>>
    Mysql 共享锁
    查看>>
    MySQL 内核深度优化
    查看>>
    mysql 内连接、自然连接、外连接的区别
    查看>>