Flask-migrate 找不到自定义模块

Chu*_*bot 0 python sqlalchemy flask flask-sqlalchemy flask-migrate

我对我的 SQLAlchemy 模型做了一些更改,我想将它们迁移到我的数据库。当我尝试迁移时,出现以下错误:

\n\n
$ flask db migrate\nUsage: flask db migrate [OPTIONS]\n\nError: While importing "minerva.dashboard.app", an ImportError was raised:\n\nTraceback (most recent call last):\n  File "/home/mattfred/Minerva/envs/dashboard/lib/python3.7/site-packages/flask/cli.py", line 235, in locate_app\n    __import__(module_name)\n  File "/home/mattfred/Minerva/minerva/dashboard/app.py", line 13, in <module>\n    from templates.nav_layout import *\nModuleNotFoundError: No module named \'templates\'\n
Run Code Online (Sandbox Code Playgroud)\n\n

我不知道自从我第一次初始化数据库以来发生了什么变化,除了将视图移动到单独的文件而不是 1 中。

\n\n

我实际上可以通过将导入语句更改为来解决此问题

\n\n
from .templates.nav_layout import *\n
Run Code Online (Sandbox Code Playgroud)\n\n

但当我尝试运行该应用程序时出现此错误:

\n\n
Traceback (most recent call last):\n  File "app.py", line 13, in <module>\n    from .templates.nav_layout import *\nModuleNotFoundError: No module named \'__main__.templates\'; \'__main__\' is not a package\n
Run Code Online (Sandbox Code Playgroud)\n\n

我已经尝试过此处提供的解决方案:Flask-Migrate“ModuleNotFoundError”

\n\n

但运行时没有错误,并且不会更改我的数据库。

\n\n

如果我删除该行,它只会移动到下一个模板文件,然后是配置文件,所以我认为模板文件没有任何问题。

\n\n
# app.py\nimport os\n\nfrom flask import Flask, redirect\nfrom flask_login import login_required, LoginManager\nfrom flask_sqlalchemy import SQLAlchemy\nfrom flask_migrate import Migrate\nfrom flask_socketio import SocketIO, emit, disconnect\n\nfrom werkzeug.wsgi import DispatcherMiddleware\n\nfrom dash import Dash\n\nfrom templates.nav_layout import *\nfrom templates.dash_app_layout import *\n\nfrom Config import Config, DEBUG\n\n# Setup the Flask server\nserver = Flask(__name__)\nserver.config.from_object(Config)\n\ndb = SQLAlchemy(server)\nmigrate = Migrate(server, db)\n\n@server.shell_context_processor\ndef make_shell_context():\n    from Models import Users, Company\n    return {\'db\': db, \'Users\': Users, \'Company\': Company}\n
Run Code Online (Sandbox Code Playgroud)\n\n

我相当确定这与项目结构有关

\n\n
\xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 app.py\n\xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 Config.py\n\xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 Forms.py\n\xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 __init__.py\n\xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 manage.py\n\xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 migrations/\n\xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 Models.py\n\xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 requirements.txt\n\xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 templates\n\xe2\x94\x82\xc2\xa0\xc2\xa0 \xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 change_profile.html\n\xe2\x94\x82\xc2\xa0\xc2\xa0 \xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 dash_app_layout.py\n\xe2\x94\x82\xc2\xa0\xc2\xa0 \xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 default_login.html\n\xe2\x94\x82\xc2\xa0\xc2\xa0 \xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 default_logout.html\n\xe2\x94\x82\xc2\xa0\xc2\xa0 \xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 _formhelpers.html\n\xe2\x94\x82\xc2\xa0\xc2\xa0 \xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 header.html\n\xe2\x94\x82\xc2\xa0\xc2\xa0 \xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 index.html\n\xe2\x94\x82\xc2\xa0\xc2\xa0 \xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 __init__.py\n\xe2\x94\x82\xc2\xa0\xc2\xa0 \xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 nav_layout.py\n\xe2\x94\x82\xc2\xa0\xc2\xa0 \xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 record_meeting.html\n\xe2\x94\x82\xc2\xa0\xc2\xa0 \xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 register_user.html\n\xe2\x94\x82\xc2\xa0\xc2\xa0 \xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 upload_meeting.html\n\xe2\x94\x82\xc2\xa0\xc2\xa0 \xe2\x94\x94\xe2\x94\x80\xe2\x94\x80 voice_enroll.html\n\xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 utils\n\xe2\x94\x82\xc2\xa0\xc2\xa0 \xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 audio_processor\n\xe2\x94\x82\xc2\xa0\xc2\xa0 \xe2\x94\x82\xc2\xa0\xc2\xa0 \xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 AudioProcessor.py\n\xe2\x94\x82\xc2\xa0\xc2\xa0 \xe2\x94\x82\xc2\xa0\xc2\xa0 \xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 audio_type_converter.py\n\xe2\x94\x82\xc2\xa0\xc2\xa0 \xe2\x94\x82\xc2\xa0\xc2\xa0 \xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 Deidentifier.py\n\xe2\x94\x82\xc2\xa0\xc2\xa0 \xe2\x94\x82\xc2\xa0\xc2\xa0 \xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 Identification\n\xe2\x94\x82\xc2\xa0\xc2\xa0 \xe2\x94\x82\xc2\xa0\xc2\xa0 \xe2\x94\x82\xc2\xa0\xc2\xa0 \xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 CreateProfile.py\n\xe2\x94\x82\xc2\xa0\xc2\xa0 \xe2\x94\x82\xc2\xa0\xc2\xa0 \xe2\x94\x82\xc2\xa0\xc2\xa0 \xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 DeleteProfile.py\n\xe2\x94\x82\xc2\xa0\xc2\xa0 \xe2\x94\x82\xc2\xa0\xc2\xa0 \xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 __init__.py\n\xe2\x94\x82\xc2\xa0\xc2\xa0 \xe2\x94\x82\xc2\xa0\xc2\xa0 \xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 Utterance.py\n\xe2\x94\x82\xc2\xa0\xc2\xa0 \xe2\x94\x82\xc2\xa0\xc2\xa0 \xe2\x94\x94\xe2\x94\x80\xe2\x94\x80 voice_enroll.py\n\xe2\x94\x82\xc2\xa0\xc2\xa0 \xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 db_operations.py\n\xe2\x94\x82\xc2\xa0\xc2\xa0 \xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 __init__.py\n\xe2\x94\x82\xc2\xa0\xc2\xa0 \xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 interim_result_processor.py\n\xe2\x94\x82\xc2\xa0\xc2\xa0 \xe2\x94\x94\xe2\x94\x80\xe2\x94\x80 utils.py\n\xe2\x94\x94\xe2\x94\x80\xe2\x94\x80 views\n    \xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 auth.py\n    \xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 dash_callbacks.py\n    \xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 __init__.py\n    \xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 meeting_upload.py\n    \xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 profile.py\n    \xe2\x94\x94\xe2\x94\x80\xe2\x94\x80 record_meeting.py\n
Run Code Online (Sandbox Code Playgroud)\n

Mig*_*uel 6

根据评论中的讨论,问题是顶级目录有一个__init__.py文件。删除该文件解决了奇怪的导入行为。