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?
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)
核心要点:
- 单一db实例:在
extensions.py中创建db = SQLAlchemy(),所有模型文件都从这里导入 - 延迟绑定:在应用工厂中才用
db.init_app(app)绑定app - 模型注册:在应用工厂中导入所有模型(
from app.models import *),确保SQLAlchemy知道所有模型类 - 导入顺序:先定义
db实例,再在模型中使用,最后在应用工厂中绑定
使用模型时,可以直接从app.models导入:
from app.models import User, Post
这样拆分后,每个模型文件保持独立,同时共享同一个db实例,避免了循环导入问题。总结:通过扩展文件集中管理db实例,在应用工厂中统一初始化。
对,第二个我明白了,我就是想根据不同的业务分成不同的 model 文件,我不太明白你说的导入方式
先了解下 Python 相对导入和绝对导入吧…用你的例子就是 from xx.app import db .
可不可以给我一个 models 拆分的例子?

