Python中如何将Flask的models文件拆分成多个文件并正确引入db?

  • 错误提示:Attempted relative import beyond top-level package

  • 结构如图,但是使用 from .. import db 引入失败,可以使用 from app import db

  • 我查了教程,import 的引入机制,看的我有点懵,有没有什么容易懂的说明
    ----------分割线-----------

  • 我目前有一个 sql 文件,执行的话,会直接导入一些数据,使用 sqlalchemy 怎么对接

  • 例如 varchar ( 100 ),int ( 10 ),怎么和 sqlalchemy 的 integer,string 对应

  • int ( 10 )我觉得是和 integer 对应,但是 integer 没有长度限制

  • 勉强试了一下发现提示 TypeError: 'list' object is not callable,弄得我不知所措

  • 希望有经验的人可以指点一下


Python中如何将Flask的models文件拆分成多个文件并正确引入db?

5 回复

model 文件下建议拆分成多个业务的 model,在里面导入业务 model 外的用绝对导入(提前设好 PYTHONPATH ),包内导入就用你那种相对导入。

int(n) 里面的 n 只是代表在 client 的显示宽度。不代表 integer 的存储大小,没什么特别的意义。


在Flask中拆分models文件并管理db实例,核心是避免循环导入并确保单例的SQLAlchemy对象被所有模型共享。通常的做法是创建一个专门的文件(如extensions.py)来初始化扩展,然后在应用工厂中集中导入和初始化。

1. 项目结构示例

your_project/
    app/
        __init__.py          # 应用工厂
        extensions.py        # 存放db等扩展实例
        models/              # 模型目录
            __init__.py      # 集中导入所有模型
            user.py
            post.py
        routes.py
    config.py
    run.py

2. 关键代码实现

app/extensions.py - 定义扩展

from flask_sqlalchemy import SQLAlchemy

# 先创建SQLAlchemy实例,但不绑定app
db = SQLAlchemy()

app/models/user.py - 用户模型

from app.extensions import db

class User(db.Model):
    __tablename__ = 'users'
    id = db.Column(db.Integer, primary_key=True)
    username = db.Column(db.String(80), unique=True, nullable=False)

app/models/post.py - 文章模型

from app.extensions import db

class Post(db.Model):
    __tablename__ = 'posts'
    id = db.Column(db.Integer, primary_key=True)
    title = db.Column(db.String(200), nullable=False)
    user_id = db.Column(db.Integer, db.ForeignKey('users.id'))

app/models/__init__.py - 集中导入模型

# 必须导入所有模型,确保它们被注册到db.metadata中
from .user import User
from .post import Post

# 可以在这里导出所有模型方便导入
__all__ = ['User', 'Post']

app/__init__.py - 应用工厂

from flask import Flask
from app.extensions import db
from app import routes  # 导入路由
from app.models import *  # 导入所有模型,确保它们被注册

def create_app(config_class='config.Config'):
    app = Flask(__name__)
    app.config.from_object(config_class)
    
    # 初始化扩展
    db.init_app(app)
    
    # 注册蓝图等
    app.register_blueprint(routes.bp)
    
    # 可选:创建数据库表(开发环境用)
    with app.app_context():
        db.create_all()
    
    return app

run.py - 启动文件

from app import create_app

app = create_app()

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

核心要点

  1. 单一db实例:在extensions.py中创建db = SQLAlchemy(),所有模型文件都从这里导入
  2. 延迟绑定:在应用工厂中才用db.init_app(app)绑定app
  3. 模型注册:在应用工厂中导入所有模型(from app.models import *),确保SQLAlchemy知道所有模型类
  4. 导入顺序:先定义db实例,再在模型中使用,最后在应用工厂中绑定

使用模型时,可以直接从app.models导入:

from app.models import User, Post

这样拆分后,每个模型文件保持独立,同时共享同一个db实例,避免了循环导入问题。总结:通过扩展文件集中管理db实例,在应用工厂中统一初始化。

对,第二个我明白了,我就是想根据不同的业务分成不同的 model 文件,我不太明白你说的导入方式

先了解下 Python 相对导入和绝对导入吧…用你的例子就是 from xx.app import db .

可不可以给我一个 models 拆分的例子?

回到顶部