Flask项目Flask-SQLAlchemy的db.Column无法识别及导入报错问题
问题原因及修复方案
1. 首先解决运行时ImportError: attempted relative import with no known parent package错误
这个错误的核心是你直接把包内的__init__.py作为入口脚本运行,Python无法将当前目录识别为合规的Python包,因此models.py中的相对导入语法from . import db失效。
修复步骤:
- 调整项目结构如下:
FlaskToDo/ # 根目录 ├── main.py # 新增的入口文件 └── website/ # 把原来所有代码移到这个子文件夹 ├── __init__.py ├── models.py ├── views.py └── auth.py - 新增的
main.py写入以下内容:from website import app if __name__ == '__main__': app.run(debug=True) - 修改
website/__init__.py的导入逻辑:
把开头的from models import User移到db初始化完成之后,所有内部模块导入改为相对导入,同时修复数据库创建逻辑适配新版Flask-SQLAlchemy,修改后的完整代码如下:from flask import Flask from flask_sqlalchemy import SQLAlchemy from os import path from flask_login import LoginManager DB_NAME = "database.db" db = SQLAlchemy() app = Flask(__name__) app.config['SECRET_KEY'] = 'bindthemostselling' app.config['SQLALCHEMY_DATABASE_URI'] = f'sqlite:///{DB_NAME}' db.init_app(app) # 所有内部导入放在db初始化之后,使用相对导入 from .views import views from .auth import auth from .models import User app.register_blueprint(views, url_prefix='/') app.register_blueprint(auth, url_prefix='/') login_manager = LoginManager() login_manager.login_view = 'auth.login' login_manager.init_app(app) @login_manager.user_loader def load_user(id): return User.query.get(int(id)) def create_database(app): db_path = path.join(path.dirname(__file__), DB_NAME) if not path.exists(db_path): # 新版Flask-SQLAlchemy需要显式传入上下文 with app.app_context(): db.create_all() print('Created Database!') create_database(app) - 后续运行项目直接执行根目录下的
main.py即可,不要直接运行website/__init__.py。
2. 解决db.Column无法被识别的问题
这个属于编辑器静态检查的误报,并非代码逻辑错误。
修复方法:
- Pycharm用户:右键点击根目录
FlaskToDo,选择Mark Directory as -> Sources Root即可消除飘红。 - VSCode用户:打开设置,搜索
python.analysis.extraPaths,将FlaskToDo目录的绝对路径添加到配置项中即可。
内容的提问来源于stack exchange,提问作者Zzz Zzz
相关产品推荐
相关产品推荐

