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

名称错误:名称"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但经过大量重写,我得到了这个

属性错误:"NoneType"对象没有属性"_autoflush"

似乎有很多不同的方法可以用来定义数据库模型。也许有更简单的方法?

简短的问题是:有人用flank+sqlalchemy做API吗?(也许棉花糖不是必需的(你是如何分割代码的?

我就是这么做的。事实上我已经快到了,但我被Base = declarative_base()完全偏离了方向

这给了我一些线索,我需要

https://flask-sqlalchemy.palletsprojects.com/en/2.x/contexts/

我不得不说,我很惊讶flask+sqlalchemy仍然没有一个简单的方法将表返回为JSON。我们对尘土飞扬的角落进行了大量研究,以确定如何构建返回JSON 的数据库API

如果有人知道让SQLAlchemy(或另一个库(轻松返回JSON的更简单的方法,我会洗耳恭听的。

app.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)

最新更新