我正在尝试使用 Flask、Mysql、SQLAlchemy 和 Alembic 构建一个 Web 应用程序。但我无法理解导入在 python 中的工作原理以及如何设置我的 target_metadata 以便能够使用 revision --autogenerate
这是我的目录树:
我的网站的init看起来像这样:
import os
from flask import Flask
app = Flask(__name__, static_folder=os.path.join(os.path.dirname(os.path.abspath(__file__)), '../static'))
app.config.from_pyfile('config.py', silent=True)
from sqlalchemy import create_engine
from sqlalchemy.orm import scoped_session, sessionmaker
from sqlalchemy.ext.declarative import declarative_base
engine = create_engine(app.config['SQLALCHEMY_DATABASE_URI'], convert_unicode=True)
db_session = scoped_session(sessionmaker(autocommit=False,
autoflush=False,
bind=engine))
Base = declarative_base()
Base.query = db_session.query_property()
@app.teardown_appcontext
def shutdown_session(exception=None):
db_session.remove()
from website import views
然后在我的 env.py 中,当我尝试像这样导入我的 Base
时:
from website import Base
target_metadata = Base.metadata
并尝试运行alembic revision --autogenerate ...
我收到此错误:
导入错误:没有名为网站的模块
。
当我尝试像这样导入Base
时:
from website import Base
target_metadata = Base.metadata
我收到此错误:ValueError:尝试在非包中进行相对导入
。
请您帮助我了解 import 在 python 中的工作原理以及如何设置我的 target_metadata ?
最佳答案
我自己最近也遇到了这个问题,尽管不是与 flask 有关。对我有用的很简单,但似乎是必要的(当前目录不在 pythonpath 上,因此当您执行 from website import Base
时,python 会抛出异常,因为它不能找到网站模块)。
尝试将其添加到 env.py 模块的顶部:
import os
import sys
sys.path.append(os.getcwd())
这是一种非常古怪的方法,但它对我有用。
另外,只是好奇...您有什么理由不使用为您完成所有这些操作的库吗?想想像flask-sqlalchemy、flask-migrate或flask-alembic这样的(我忘了是哪一个,但它为你包装了alembic)。 如果您不知道这些,您可能需要查看flask extension registry 。那里有一些非常方便的。
关于python - [Flask][Alembic] 无法在 env.py 中设置 target_metadata,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43455316/