我正在构建一个Flask应用程序foo
,直到现在这是文件的组织方式
foo
|-- app
| |-- __init__.py
| |-- models.py
|
|-- foo.py
在__init__.py
中,我定义了一个函数来创建应用程序,然后从foo.py
中调用它。 __init__.py
的样子如下:
from flask_sqlalchemy import SQLAlchemy
db = SQLAlchemy()
def create_app(config_name):
app = Flask(__name__)
...
db.init_app(app)
模块models.py
导入db
并访问现有数据库。到目前为止,我一直在使用db.engine.execute(<...>)
进行查询,但这似乎效率很低。例如,我有一个名为var
的表,可以在我的应用程序中不断访问它,因此我在models.py
class Var(object):
def query ...
但我想改用alchemy
:
class Var(db.Model):
...
我试图遵循答案here来构建我的应用程序,但这是我到目前为止发现的问题
如果我在base.metadata.reflect(db.engine)
函数中插入create_app
,则会收到一条错误消息,提示我需要创建一个上下文,这没有多大意义,因为这是地方我在哪里创建它。当然,如果我with app.app_context(): base.metadata.reflect(db.engine)
可以解决,但是创建类Var
时问题仍然存在:
类Var(db.Model): 表 = db.Model.metadata.tables ['var']
字典是空的,所以我得到一个KeyError
。
models
内创建context来创建我的类Var
时,它也失败了,因为它无法导入。我尝试了所有发现的建议,但似乎都没有用。谢谢您的帮助
答案 0 :(得分:2)
问题是,您使用的Flask-SQLAlchemy
与大多数flask扩展一样,与flask绑定在一起,并且为了运行某些任务,它需要flask上下文,但是要反映一个已经存在的数据库,您需要独立于任何请求的引擎。
您可能仍可以在需要的地方使用db
来使用with app.app_context()
,但是最好不要使用Flask-SQLAlchemy
而是直接使用SQLAlchemy
并使用{{1 }},就像您链接的问题一样。