我正在尝试使用flask,Mysql,SQLAlchemy和Alembic构建一个webapp。但我无法理解导入如何在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 ...
我收到此错误:
ImportError: No module named website
。
当我尝试像这样导入Base
时:
from website import Base
target_metadata = Base.metadata
我收到此错误:ValueError: Attempted relative import in non-package
。
请帮助我了解python中的import如何工作以及如何设置target_metadata?
答案 0 :(得分:2)
我最近刚刚遇到这个问题,但不是烧瓶。对我有用的很简单,但似乎是必要的(当前目录不在python路径上,所以当你执行from website import Base
时,python会抛出异常,因为它无法找到网站模块)。
尝试在env.py模块的顶部添加:
import os
import sys
sys.path.append(os.getcwd())
这是一种真正的hacky方式,但它适用于我。
另外,这里只是好奇......你是不是有任何理由不使用库来为你做所有这些?想想像flask-sqlalchemy,flask-migrate或flask-alembic(我忘了它,但它为你包装了alembic)。 如果您不知道这些,可能需要查看flask extension registry。那里有些非常方便。