You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何将Flask的db.Model模型类存放至独立.py文件并在主文件中调用

实现方案

方案1:标准拆分(推荐,无循环导入风险,适合长期维护项目)

该方案将全局扩展单独抽离管理,从根源避免循环导入问题,后续新增其他模型/扩展也可以沿用相同结构:

  1. 新建和main.py同目录的extensions.py文件,存放全局扩展实例:
# extensions.py
from flask_sqlalchemy import SQLAlchemy
# 先实例化数据库对象,暂时不绑定Flask应用
db = SQLAlchemy()
  1. 新建和main.py同目录的models.py文件,定义Contact模型:
# models.py
from extensions import db

class Contact(db.Model):
    sno = db.Column(db.Integer, primary_key=True)
    name = db.Column(db.String(50), unique=False, nullable=False)
    email = db.Column(db.String(50), unique=True, nullable=False)
    phone = db.Column(db.String(50), unique=True, nullable=False)
    msg = db.Column(db.String(50), unique=False, nullable=False)
    myDate = db.Column(db.String(50), unique=False, nullable=False)
  1. 修改main.py代码,调整导入逻辑并绑定应用:
# main.py 调整后完整代码
from datetime import datetime
from enum import unique
from flask import Flask, render_template, request
from flask.wrappers import Request
# 导入抽离的数据库实例和模型
from extensions import db
from models import Contact

app = Flask(__name__)
app.config['SQLALCHEMY_DATABASE_URI'] = 'mysql://root:@localhost/thecleandb'
# 给数据库实例绑定当前Flask应用
db.init_app(app)

@app.route("/contact", methods=['GET','POST'])
def contact():
    if (request.method=='POST'):
        name= request.form.get('name')
        email = request.form.get('myemail')
        phone_number = request.form.get('myphone')
        message = request.form.get('msg')
        database_entry = Contact(name=name, email=email, phone=phone_number, msg=message, myDate=datetime.now().date() )
        db.session.add(database_entry)
        db.session.commit()
        return render_template('contact.html')
    else :
        return render_template('contact.html')

if __name__ =='__main__':
    app.run(debug=True)

方案2:极简拆分(适合小型临时项目)

如果不想新增额外的扩展管理文件,可以通过调整导入顺序规避循环导入问题:

  1. 新建和main.py同目录的models.py文件:
# models.py
from main import db

class Contact(db.Model):
    sno = db.Column(db.Integer, primary_key=True)
    name = db.Column(db.String(50), unique=False, nullable=False)
    email = db.Column(db.String(50), unique=True, nullable=False)
    phone = db.Column(db.String(50), unique=True, nullable=False)
    msg = db.Column(db.String(50), unique=False, nullable=False)
    myDate = db.Column(db.String(50), unique=False, nullable=False)
  1. 修改main.py,必须保证模型导入逻辑放在数据库实例初始化之后:
# main.py 调整后完整代码
from datetime import datetime
from enum import unique
from flask import Flask, render_template, request
from flask.wrappers import Request
from flask_sqlalchemy import SQLAlchemy

app = Flask(__name__)
app.config['SQLALCHEMY_DATABASE_URI'] = 'mysql://root:@localhost/thecleandb'
db = SQLAlchemy(app)

# 必须放在db实例化之后导入,否则会触发循环导入报错
from models import Contact

@app.route("/contact", methods=['GET','POST'])
def contact():
    if (request.method=='POST'):
        name= request.form.get('name')
        email = request.form.get('myemail')
        phone_number = request.form.get('myphone')
        message = request.form.get('msg')
        database_entry = Contact(name=name, email=email, phone=phone_number, msg=message, myDate=datetime.now().date() )
        db.session.add(database_entry)
        db.session.commit()
        return render_template('contact.html')
    else :
        return render_template('contact.html')

if __name__ =='__main__':
    app.run(debug=True)

注意:该方案依赖严格的导入顺序,项目规模扩大后容易出现导包错误,仅适合临时小型项目使用。

内容的提问来源于stack exchange,提问作者user5058807

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.07 10:54:04