【问题标题】:Python Flask SQLAlchemy: Import app.db to /models/model.py is failingPython Flask SQLAlchemy:将 app.db 导入 /models/model.py 失败
【发布时间】:2021-03-12 07:31:36
【问题描述】:

我觉得我犯了一个我无法确定的菜鸟错误。

我有以下文件夹结构

--MyAppRoot\
--app.py
----\models\__init__.py
----\models\models.py
----\models\data_handler.py
----\models\forms.py
----\models\a_few_other_py_files_etc.py

我的 app.py 有通常的 Flask(__name__) 等和 db = SQLAlchemy(app) 初始化。一切正常,来自各种模型 py 文件的所有导入工作正常,通常的东西,如烧瓶形式、wtforms 等。

在我的 data_handler.py 文件中,我正在运行一个利用 Pandas 到 .send_to_sql 的刮板,但是我现在需要导入 db,以便我可以在 db.session.execute(query) 中执行原始 SQL query 以在类中使用,但是当这样做我得到以下错误:

Traceback (most recent call last):
  File "C:/Users/me/PythonProjects/MyAppRoot/models/data_handler.py", line 7, in <module>
    from app import db
  File "C:\Users\me\PythonProjects\MyAppRoot\app.py", line 1, in <module>
    from models.forms import (RegisterForm,
ModuleNotFoundError: No module named 'models.forms'; 'models' is not a package

任何帮助表示赞赏。

【问题讨论】:

  • 简短回答:\models\models.py 重命名为 \some_other_name\models.py
  • 还建议在考虑应用程序目录结构之前阅读 Flask 应用程序工厂模式和蓝图(在 github 中搜索`flask create_app`)
  • 堆栈跟踪显示您可能循环导入models/xxx 需要app 也需要app 需要models/xxx,我相信ModuleNotFoundError 来自不正确的PYTHONPATH
  • 谢谢@madzohan,这是正确的答案。工作得很好,我学会了不要将 py 文件命名为与目录相同的名称。请发布完整答案,我会选择这样。

标签: python flask import sqlalchemy package


【解决方案1】:

问题

在运行 data_handler.py 时,python 导入系统会在同一目录级别 (models.py) 上找到名为 models 的模块。如果名称匹配,它不会通过 PYTHONPATH 进一步查看。

包含正在运行的脚本的目录位于搜索路径的开头 https://docs.python.org/3/tutorial/modules.html#the-module-search-path

How python deals with module and package having the same name?

解决方案 #1


所以你必须重命名包或模块名称\models\models.py 才能使导入系统正常工作。

可能的解决方案 #2(不确定)


您可以尝试以这种方式从C:/Users/me/PythonProjects/MyAppRoot/ 目录而不是C:/Users/me/PythonProjects/MyAppRoot/models/ 运行您的脚本:

python -m models.data_handler

【讨论】:

  • 非常感谢。我可以确认将 models/models.py 重命名为 something_else/models.py 已解决此问题。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-07-21
  • 1970-01-01
  • 1970-01-01
  • 2016-04-06
  • 2017-08-08
  • 1970-01-01
相关资源
最近更新 更多