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

标签 python flask flask-sqlalchemy alembic

我正在尝试使用 Flask、Mysql、SQLAlchemy 和 Alembic 构建一个 Web 应用程序。但我无法理解导入在 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 ... 我收到此错误: 导入错误:没有名为网站的模块

当我尝试像这样导入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/

相关文章:

python - 在请求上下文之外(在生成器内)设置 flask session 变量

python - Flask 应用上下文和 celery 集成

python flask 在每条路线上做一些事情

python - 如何使用SQLAlchemy在SQLite上创建全文检索索引并进行查询?

flask - SQLAlchemy 多对多关系更新具有额外列的关联对象

python - 索引错误 : too many indices for array when plot winds netcdf

python - 尝试在 basemap 上绘制数据点(Python)

python - Flask-SQLAlchemy 多对多

python - py-faster-rcnn 中的“最大重叠”问题

python - 访问 pyomo 约束中出现的所有变量