博客
关于我
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:如何模拟 datetime.utcnow()?
    查看>>
    Python:如果DataFrames之间的其他值匹配,则对DataFrame中的值求和
    查看>>
    Python:字典思维
    查看>>
    Python:将 HEX 字符串转换为字节
    查看>>
    Python:将列表与范围列表合并
    查看>>
    Python:将列表列表初始化为一定大小,
    查看>>
    Python:带有生成器的给定集合的幂集
    查看>>
    Python:按字符的位置拆分字符串
    查看>>
    Python:替换嵌套字典中的值
    查看>>
    Python:爬取数据出现response.status_code为403解决方法
    查看>>
    Python:爬取数据出现response.status_code为418解决方法
    查看>>
    Python:生成“元组集“;来自“元组列表“;不考虑顺序
    查看>>
    Python:生成具有趋势的随机时间序列数据(例如周期性、指数衰减等)
    查看>>
    Python:用渐进式数字重命名列表中的重复项而不对列表进行排序
    查看>>
    Python:矩形参数无效
    查看>>
    Python:语法进阶
    查看>>
    Python:调用复制函数时调用 Python 对象时超出了最大递归深度
    查看>>
    Python:这两个 import 语句有什么区别?
    查看>>
    Python:通过串口从 Velleman k8090 读取数据
    查看>>
    python:遍历具有列表值的字典
    查看>>