python - Python外部化数据库模型文件
问题描述
我正在 Python 烧瓶中构建一个 Web API。
...需要库 SQLAlchemy 进行数据库连接
...这需要棉花糖将数据库结果呈现为 JSON
通过一些示例,我现在在我的 app.py 文件中有此代码,它成功返回了表的 JSON 表示。
from flask import Flask, request
from flask_sqlalchemy import SQLAlchemy
from marshmallow import Schema, fields, ValidationError, pre_load
from flask import jsonify
import pyodbc
app = Flask(__name__)
app.config["SQLALCHEMY_DATABASE_URI"] = 'mssql+pyodbc://localhost/database?driver=SQL+Server+Native+Client+11.0'
app.config['SQLALCHEMY_TRACK_MODIFICATIONS'] = False
db=SQLAlchemy(app)
### MODELS ###
class Table1(db.Model):
__table_args__ = {'schema': 'MySchema'}
MyId=db.Column(db.Integer, primary_key=True)
Field1=db.Column(db.Integer)
Field2=db.Column(db.Integer)
### Schemas ###
class Table1Schema(Schema):
MyId=fields.Integer(dump_only=True)
Field1=fields.Integer()
Field2=fields.Integer()
Table1_schema=Table1Schema(many=True)
#### ROUTES ####
@app.route('/')
def index():
return 'Index'
@app.route('/Table2')
def Table2():
rows=Table1.query.all()
return jsonify(Table1_schema.dump(rows))
在模型和路线之间,我有很多模型代码
我想将此模型代码放在一个单独的文件中,但我不确定如何拆分它。
我尝试将所有模型代码移动到它自己的文件中,并在我定义后导入,db
但它没有看到db
.
NameError:名称“db”未定义
from flask import Flask, request
from flask_sqlalchemy import SQLAlchemy
from marshmallow import Schema, fields, ValidationError, pre_load
from flask import jsonify
import pyodbc
app = Flask(__name__)
app.config["SQLALCHEMY_DATABASE_URI"] = 'mssql+pyodbc://localhost/database?driver=SQL+Server+Native+Client+11.0'
app.config['SQLALCHEMY_TRACK_MODIFICATIONS'] = False
db=SQLAlchemy(app)
import mymodelfile
这种东西一般是怎么拆分的?我可以用一个虚拟类定义我的模型和模式吗?我也尝试过像这个示例一样重新编码https://docs.sqlalchemy.org/en/13/orm/tutorial.html但经过大量重写后我得到了这个
AttributeError:“NoneType”对象没有属性“_autoflush”
似乎有很多不同的方法可以走上定义数据库模型的老路。也许有更简单的方法?
简短的问题是:有没有人使用flask+sqlalchemy 来制作API?(也许不需要棉花糖)你是如何拆分代码的?
解决方案
这就是我为使其正常工作所做的。我实际上几乎就在那里,但我完全偏离了方向Base = declarative_base()
这给了我一些我需要的线索
https://flask-sqlalchemy.palletsprojects.com/en/2.x/contexts/
我不得不说我很惊讶flask+sqlalchemy 仍然没有一种简单的方法来将表作为JSON 返回。在尘土飞扬的角落进行了大量研究,以找出如何构建返回 JSON 的数据库 API
如果有人知道让 SQLAlchemy(或其他库)轻松返回 JSON 的更简单方法,我会全力以赴。
应用程序.py
from flask import Flask, request, jsonify
from flask_sqlalchemy import SQLAlchemy
import pyodbc
# This is my external model file
import dbmodel
# set up flask app and sqlalchemy
app = Flask(__name__)
app.config["SQLALCHEMY_DATABASE_URI"] = 'mssql+pyodbc://MySQLServerHost/MySQLServerDB?driver=SQL+Server+Native+Client+11.0'
app.config['SQLALCHEMY_TRACK_MODIFICATIONS'] = True
db=SQLAlchemy(app)
# This is the actual flask code that defines the route and returns the data as JSON
@app.route('/MyTable')
def MyTable():
rows=dbmodel.MyTable.query.all()
return jsonify(dbmodel.mytable_schema.dump(rows))
数据库模型.py
from flask_sqlalchemy import SQLAlchemy
from marshmallow import Schema, fields, ValidationError, pre_load
from marshmallow_sqlalchemy import SQLAlchemyAutoSchema
# https://flask-sqlalchemy.palletsprojects.com/en/2.x/contexts/
db=SQLAlchemy()
# SQLAlchemy Models
class MyTable(db.Model):
__table_args__ = {'schema': 'MyDBSchema'}
Col1=db.Column(db.Integer, primary_key=True)
Col2=db.Column(db.Integer)
Col3=db.Column(db.Integer)
# marshmallow schema
# Seems like marshmallow is the easiest way to create a json response from SQLAlchemy
class MyTableSchema(SQLAlchemyAutoSchema):
class Meta:
model=MyTable
# last piece of the puzzle to use marshmallow
mytable_schema=MyTableSchema(many=True)
推荐阅读
- excel - 在 VBA 中定义 MoveButton 函数表
- flutter - 如何使用颤振将 TableRow 动态添加到表中
- sql - 我们如何使用 SQL 在 Magento 中更新产品价格
- r - 使用 ncdf4 包从 .csv 到 .nc 文件(ncvar_put 中的错误)
- matlab - 如何将 0.1 和 0.22 之间的数字扩大到更大的距离 0 和 1?
- c# - 绑定 SelectedIndexChanged
- java - 如何替换 2D java arraylist 中的空元素?
- javascript - canvas.getZoom() 在Angular8中使用fabricjs未定义
- python - Paho MQTT 客户端断开连接,重新连接后不再有消息传入
- ios - 孤立的工件 iMessage 扩展 - iOS 错误