python-3.x - Flask-sqlalchemy:如何使用现有数据库中的自定义构造函数序列化对象?
问题描述
我正在尝试学习如何从我收集的一些现有数据中创建基于 python 的后端。我开始意识到我绝对想使用 sqlalchemy,而烧瓶似乎是一个很好的库。我的问题是,即使在阅读 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]"
},
我找到了一个很棒的教程,我可以用它逐记录输出整个表记录,但结构不是我想要的,我认为在这种情况下在前端创建所需的结构没有意义。
这是将整个表逐个记录输出到 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数据通常是如何插入到具有新结构的对象中然后序列化的吗?就我而言,我是否需要主要在元数据、对象或棉花糖级别上进行更改?我很惊讶我找不到一些好的例子。
解决方案
推荐阅读
- html - 从迭代循环中隐藏特定内容并在隐藏面板中显示
- spring-boot - 使用同一服务的多个版本时,我们应该如何设计数据库
- javascript - 使用 forceX/Y 时无法更改链接强度
- intellij-idea - 永久不索引某些文件夹
- web-api-testing - 我想使用谷歌搜索执行 API 测试。
- python-3.x - 如何在 Scrapy CrawlSpider 中找到当前的 start_url?
- javascript - 如何使用 JavaScript 和 CSS Grid 使 RadWindow 响应基于屏幕/视口大小
- javascript - 每次我修改代码时,React build 都会出错
- html - Jquery函数没有被触发
- php - 如何将 html 下拉菜单链接到 php xpath 查询到 xml 文件?