Python 外部化数据库模型文件

Python externalise database model file

我正在 Python 烧瓶中构建网络 API。

...需要用于数据库连接的库 SQLAlchemy

... 这需要棉花糖将数据库结果呈现为 JSON

通过一些示例,我现在在我的 app.py 文件中有这段代码,其中 returns 成功地 table 的 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))

MODELSROUTES之间我有很多模型代码

我想把这个模型代码放在一个单独的文件中,但我不确定如何拆分它。

我尝试将所有模型代码移动到它自己的文件中并在定义 db 后导入,但它没有看到 db.

NameError: name 'db' is not defined

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

这种东西一般是怎么拆分的?我可以只用一个虚拟 class 来定义我的模型和模式吗?我也试过像这个示例一样重新编码 https://docs.sqlalchemy.org/en/13/orm/tutorial.html 但经过大量重写后我得到了这个

AttributeError: 'NoneType' object has no attribute '_autoflush'

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

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

这就是我为使它正常工作所做的工作。我实际上快到了,但是 Base = declarative_base()

完全让我分心了

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

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

我不得不说我很惊讶 flask+sqlalchemy 仍然没有一个简单的方法来 return a table as JSON。在尘土飞扬的角落进行了大量研究,才弄清楚如何构建一个 return JSON

的数据库 API

如果有人知道更简单的方法让 SQLAlchemy(或其他库)轻松 return 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))

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