[Flask] [Alembic]无法在env.py中设置target_metadata

时间:2017-04-17 16:24:10

标签: python flask flask-sqlalchemy alembic

我正在尝试使用flask,Mysql,SQLAlchemy和Alembic构建一个webapp。但我无法理解导入如何在python中工作以及如何设置我的target_metadata以便能够使用revision --autogenerate

这是我的目录树:

enter image description here

我的网站 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?

1 个答案:

答案 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。那里有些非常方便。