Flask-sqlalchemy:如何使用现有数据库中的自定义构造函数序列化对象?

时间:2018-07-01 11:51:24

标签: python-3.x flask sqlalchemy flask-sqlalchemy

我正在尝试学习如何从我收集的一些现有数据中创建基于python的后端。我已经意识到,我绝对想使用sqlalchemy,并且flask似乎是一个不错的库。我的问题是,即使在阅读了sqlalchemy文档并浏览了stackexchange上的各种答案之后,我仍然不明白如何将数据从现有表中重塑为结构完全不同的对象。

我要进行的转换非常具体。我想从我的MariaDB表中的该结构开始:

列:公司名称,日期,指标(1 ... 23)

对于从序列化类对象生成的json输出:

{
  "company_name[1]": 
    {
      "indicator_name[1]":
        {
          "date[1]": "indicator_name[1].value[1]",
          "date[2]": "indicator_name[1].value[2]",
          "date[3]": "indicator_name[1].value[3]",
          "date[4]": "indicator_name[1].value[4]",
          "date[5]": "indicator_name[1].value[5]"
        },
      "indicator_name[2]":
        {
          "date[1]": "indicator_name[2].value[1]",
          "date[2]": "indicator_name[2].value[2]",
          "date[3]": "indicator_name[2].value[3]",
          "date[4]": "indicator_name[2].value[4]",
          "date[5]": "indicator_name[2].value[5]"
        },

我发现了一个很棒的教程,通过它我可以按记录输出整个表记录,但是结构不是我想要的,在这种情况下,我认为在前端创建所需的结构是没有道理的。 / p>

这是将整个表按记录输出到json记录的代码:

from flask import Flask, jsonify
from flask_sqlalchemy import SQLAlchemy 
from sqlalchemy import PrimaryKeyConstraint
from sqlalchemy import orm
from sqlalchemy import select, func
from sqlalchemy import Column, Integer, String, ForeignKey
from flask_marshmallow import Marshmallow
import decimal
import flask.json

class MyJSONEncoder(flask.json.JSONEncoder): # Enables decimal queries for the API
    def default(self, obj):
        if isinstance(obj, decimal.Decimal):
            # Convert decimal instances to strings.
            return str(obj)
        return super(MyJSONEncoder, self).default(obj)

app = Flask(__name__)

app.config['SQLALCHEMY_DATABASE_URI'] = 'mysql+pymysql://USER:PASS@localhost:3306/kl_balance_sheets'

app.json_encoder = MyJSONEncoder
db = SQLAlchemy(app)
ma = Marshmallow(app)

# Bind declarative base to engine
db.Model.metadata.reflect(db.engine)


class CompanyData(db.Model):
    __table__ = db.Model.metadata.tables['kl_balance_sheets']

class CompanyDataSchema(ma.ModelSchema):
    class Meta:
        model = CompanyData

@app.route('/')
def index():
    company_data = CompanyData.query.all()
    company_data_schema = CompanyDataSchema(many=True)
    output = company_data_schema.dump(company_data).data
    return jsonify({'company_data' : output})

if __name__ == '__main__':
    app.run(debug=True)

我猜的主要问题是:如何编辑此代码以生成所需的json?

我认为我应该做的是创建一个自定义构造函数,然后将其输入到索引函数中,但是我不知道如何具体地做到这一点。我遇到的两个选择是:

@orm.reconstructor
def init_on_load(self):
    #do custom stuff

或:

class Foo(db.Model):
# ...
def __init__(**kwargs):
super(Foo, self).__init__(**kwargs)
# do custom stuff

在我看来,这似乎是任何烧瓶棉花糖用户都会定期进行的基本操作。有人可以解释一下通常如何将sql数据插入具有新结构的对象中,然后进行序列化吗?就我而言,我是否需要主要在元数据,对象或棉花糖级别上进行更改?我很惊讶我找不到很好的例子。

0 个答案:

没有答案