博客
关于我
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/

    你可能感兴趣的文章
    python+pytest接口自动化:接口测试
    查看>>
    Python+requests+unittest执行接口自动化测试详情
    查看>>
    Python+requests+unittest执行接口自动化测试详情
    查看>>
    python+requests+unittest执行自动化接口测试!
    查看>>
    Python+Requests编码识别Bug
    查看>>
    python函数编写_[零基础学python]传说中的函数编写条规
    查看>>
    Python+selenium —— UI自动化之鼠标操作
    查看>>
    python函数注释,参数后面加冒号:,函数后面的箭头→是什么?
    查看>>
    Python+Selenium+Threading进行兼容性测试
    查看>>
    Python+selenium+unittest的GUI自动化框架实现
    查看>>
    python函数拟合不规则曲线_Python计算&绘图——曲线拟合问题(转)
    查看>>
    python函数定义的基本格式_零基础学python-2.19 定义函数、调用函数与默认参数
    查看>>
    Python+Selenium之数据驱动测试的实现
    查看>>
    python函数定义与使用+返回值简解
    查看>>
    Python+Selenium登录
    查看>>
    Python日期时间模块
    查看>>
    Python函数合集:足足68个内置函数请收好!
    查看>>
    Python+Selenium自动化测试项目实战
    查看>>
    Python+Selenium自动化测试项目实战【建议收藏】
    查看>>
    Python+Selenium自动化测试:Page Object模式
    查看>>