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

    你可能感兴趣的文章
    Mysql5.7版本单机版my.cnf配置文件
    查看>>
    mysql5.7的安装和Navicat的安装
    查看>>
    mysql5.7示例数据库_Linux MySQL5.7多实例数据库配置
    查看>>
    Mysql8 数据库安装及主从配置 | Spring Cloud 2
    查看>>
    mysql8 配置文件配置group 问题 sql语句group不能使用报错解决 mysql8.X版本的my.cnf配置文件 my.cnf文件 能够使用的my.cnf配置文件
    查看>>
    MySQL8.0.29启动报错Different lower_case_table_names settings for server (‘0‘) and data dictionary (‘1‘)
    查看>>
    MYSQL8.0以上忘记root密码
    查看>>
    Mysql8.0以上重置初始密码的方法
    查看>>
    mysql8.0新特性-自增变量的持久化
    查看>>
    Mysql8.0注意url变更写法
    查看>>
    Mysql8.0的特性
    查看>>
    MySQL8修改密码报错ERROR 1819 (HY000): Your password does not satisfy the current policy requirements
    查看>>
    MySQL8修改密码的方法
    查看>>
    Mysql8在Centos上安装后忘记root密码如何重新设置
    查看>>
    Mysql8在Windows上离线安装时忘记root密码
    查看>>
    MySQL8找不到my.ini配置文件以及报sql_mode=only_full_group_by解决方案
    查看>>
    mysql8的安装与卸载
    查看>>
    MySQL8,体验不一样的安装方式!
    查看>>
    MySQL: Host '127.0.0.1' is not allowed to connect to this MySQL server
    查看>>
    Mysql: 对换(替换)两条记录的同一个字段值
    查看>>