首页 > 解决方案 > 烧瓶应用的模型模块

问题描述

我正在构建一个烧瓶应用程序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):
    ...

我试图按照这里的答案来构建我的应用程序,但这些是我迄今为止发现的问题

  1. 如果我base.metadata.reflect(db.engine)create_app函数中插入,我会收到一个错误,说我需要创建一个上下文,这没有多大意义,因为这是我创建它的地方。当然,如果我这样做,with app.app_context(): base.metadata.reflect(db.engine)我可以绕过,但是当我创建类时问题仍然存在Var

    类 Var(db.Model): table = db.Model.metadata.tables['var']

字典是空的,所以我得到一个KeyError.

  1. 当我尝试在内部创建上下文models以创建我的类Var时,它也会失败,因为它无法导入它。

我已经尝试了所有我发现的建议,但似乎没有一个有效。谢谢你的帮助

标签: pythonflaskflask-sqlalchemy

解决方案


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

您可能仍然可以在需要的任何地方db使用with app.app_context(),但最好不要使用Flask-SQLAlchemy,而是SQLAlchemy直接使用和使用create_engine,就像在您链接的问题中一样。


推荐阅读