烧瓶应用的模型模块

时间:2018-08-27 19:47:48

标签: python flask flask-sqlalchemy

我正在构建一个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来构建我的应用程序,但这是我到目前为止发现的问题

  1. 如果我在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

  1. 当我尝试在models内创建context来创建我的类Var时,它也失败了,因为它无法导入。

我尝试了所有发现的建议,但似乎都没有用。谢谢您的帮助

1 个答案:

答案 0 :(得分:2)

问题是,您使用的Flask-SQLAlchemy与大多数flask扩展一样,与flask绑定在一起,并且为了运行某些任务,它需要flask上下文,但是要反映一个已经存在的数据库,您需要独立于任何请求的引擎。

您可能仍可以在需要的地方使用db来使用with app.app_context(),但是最好不要使用Flask-SQLAlchemy而是直接使用SQLAlchemy并使用{{1 }},就像您链接的问题一样。