如何在Python Flask中使用数据库模型?

How to use database models in Python Flask?

我正在尝试学习 Flask 并在其中使用 postgresql。我正在学习本教程 https://realpython.com/flask-by-example-part-2-postgres-sqlalchemy-and-alembic/,但我不断收到错误消息。

Cannot import name 'AorticStenosis' from partially initialized module 'models' (most likely due to a circular import)

我明白这个问题,但我不知道如何解决它。所以,我开始玩弄并尝试在我正在处理的事情上使用分步教程,但我仍然遇到同样的问题。

这是我的尝试:

Models.py

from app import db

class AorticStenosis(db.Model):

    __tablename__ = 'wvu-model'
    
    id = db.Column(db.Integer, primary_key=True)
    
    ip_address = db.Column(db.String())
    date_created = db.Column(db.DateTime, default=datetime.utcnow)
    e_prime = db.Column(db.Float())
    
    LVMi = db.Column(db.Float())
    
    A = db.Column(db.Float())
    
    LAVi = db.Column(db.Float())
    
    E_e_prime = db.Column(db.Float())
    
    EF = db.Column(db.Float())
    
    E = db.Column(db.Float())
    
    E_A = db.Column(db.Float())
    
    TRV = db.Column(db.Float())
    
    prediction = db.Column(db.String())


def __init__(self, ip_address, e_prime, LVMi, A, E_e_prime, EF, E, E_A, TRV, prediction):
    print('initialized')
    self.ip_address = ip_address
    self.e_prime = e_prime
    self.LVMi = LVMi
    self.A = A
    self.LAVi = LAVi
    self.E_e_prime = E_e_prime 
    self.EF = EF
    self.E = E
    self.E_A = E_A 
    self.TRV = TRV
    self.prediction = prediction


def __repr__(self):
    return '<id {}>'.format(self.id)

app.py

import os
import ast
import bcrypt
from flask import Flask, redirect, render_template, request, session, url_for
import flask_login
from flask_sqlalchemy import SQLAlchemy
from bigml.deepnet import Deepnet
from bigml.api import BigML
import pickle as pkl
import sklearn


app = Flask(__name__)

if app.config['ENV'] == 'production':
    app.config.from_object('as_config.ProductionConfig')

else: 
    app.config.from_object("config.DevelopmentConfig")

# app.config.from_pyfile('as_config.py')
# app.config.from_object(os.environ['APP_SETTINGS'])
# app.config.from_object('as_config.DevelopmentConfig')
app.config['SQLALCHEMY_TRACK_MODIFICATIONS'] = False
db = SQLAlchemy(app)

from models import AorticStenosis

login_key = app.config['LOGIN_KEY']
api_key = app.config['API_KEY']
model = app.config['MODEL']

api = BigML(login_key, api_key)
deepnet = Deepnet(model, api=api)
scaler = pkl.load(open("scaler.pkl", "rb"))


@app.route("/", methods=["GET", "POST"])
def home():
    prediction = None
    if request.method == "POST":
        form_data = [
            float(request.form.get("e_prime")),
            float(request.form.get("LVMi")),
            float(request.form.get("A")),
            float(request.form.get("LAVi")),
            float(request.form.get("E_e_prime")),
            float(request.form.get("EF")),
            float(request.form.get("E")),
            float(request.form.get("E_A")),
            float(request.form.get("TRV"))
        ]
        form_data = scaler.transform([form_data])[0]
        
        print(form_data)
        

        prediction = str(deepnet.predict({
            "e_prime": form_data[0],
            "LVMi": form_data[1],
            "A": form_data[2],
            "LAVi": form_data[3],
            "E_e_prime": form_data[4],
            "EF": form_data[5],
            "E": form_data[6],
            "E_A": form_data[7],
            "TRV": form_data[8]
        }, full=True))
        prediction = ast.literal_eval(prediction)
        print(prediction)
        

        ## get ip address from the user
        ip_address = request.environ['REMOTE_ADDR']
        print("ip_address: ", ip_address)

        try:
            aorticStenosis = AorticStenosis(
                    ip_address = ip_address,
                    e_prime = form_data[0],
                    LVMi = form_data[1],
                    A = form_data[2],
                    LAVi = form_data[3],
                    E_e_prime = form_data[4],
                    EF = form_data[5],
                    E = form_data[6],
                    E_A = form_data[7],
                    TRV = form_data[8]
                )

            db.session.add(aorticStenosis)
            db.session.commit()

        except Exception as e:
            print(str(e))



        if prediction["prediction"] == "1":
            prediction["prediction"] = "Low Risk"
            prediction["probability"] = round(
                1 - prediction["probability"], 6)
        elif prediction["prediction"] == "2":
            prediction["prediction"] = "High Risk"
        else:
            prediction["prediction"] = "No prediction was made!"
        return render_template("home.html",
                               prediction=prediction["prediction"],
                               probability=prediction["probability"])
    else:
        return render_template("home.html")


if __name__ == "__main__":
    app.run(host="0.0.0.0", port="8000")

我创建了一个新文件 database.py 并在其中定义了数据库。

database.py

from flask_sqlalchemy import SQLAlchemy
db = SQLAlchemy()
def init_app(app):
    db.init_app(app)

app.py

import database
...
database.init_app(app)

models.py

from database import db
...