Flask:应用程序未在db实例上注册,并且没有应用程序绑定到当前上下文

时间:2018-01-29 23:04:50

标签: python flask sqlalchemy

我试图扩展基于烧瓶的项目https://github.com/hack4impact/flask-base/tree/master/app在此app/_init.py初始化烧瓶应用程序,其中包含多个扩展名,包括sqlalchemy:

mail = Mail()
db = SQLAlchemy()
.....

def create_app(config_name):
    ....
    db.init_app(app)
    login_manager.init_app(app)
    ...

但随后单独的数据模型在app/models中定义,例如在app / models.user.py中我有:

class User(UserMixin, db.Model):
    __tablename__ = 'users'
    id = db.Column(db.Integer, primary_key=True)
    confirmed = db.Column(db.Boolean, default=False)
    first_name = db.Column(db.String(64), index=True)
    last_name = db.Column(db.String(64), index=True)
    ....

我想创建一个能够查询数据库中所有表的会话对象,并在我的视图中使用它,就像在https://www.pythoncentral.io/understanding-python-sqlalchemy-session/中一样,但这个例子最适用于有单个文件的情况,不是像这个相对复杂的烧瓶应用程序那样更分散的设置。我试图按照Flask and SQLAlchemy, application not registered on instance

中的想法进行操作

在app / models / init .py中,我有

"""
These imports enable us to make all defined models members of the models
module (as opposed to just their python files)
"""

from .user import *  # noqa
from .miscellaneous import *  # noqa
from .out import *  # noqa
from .properties import *  # noqa
from .accounts import *  # noqa

在main.views中我有:

from app import db
from ..models import *



s = db.session()
print('hi')

@main.route('/')
def index():
    return render_template('main/index.html')

我收到上述错误。我不确定如何将各个部分放在一起以获得可访问db中所有表的会话对象

编辑:

基于答案,我尝试将以下内容添加到我的一个视图函数中:

db.session.add(Postings)
recordset = db.session.add(Postings).query.all()

现在我得到了:

sqlalchemy.orm.exc.UnmappedInstanceError: Class 'flask_sqlalchemy._BoundDeclarativeMeta' is not mapped; was a class (app.models.out.Postings) supplied where an instance was required?

1 个答案:

答案 0 :(得分:2)

如果你想学习SQLAlchemy会话基础知识,从相对复杂的Flask项目实施开始(使用app工厂)实际上并不是一个好主意,因为大多数事情都是自动完成的,而且你是&#39 ;对你自己的实现有点限制。

您的代码最大的问题是,应用工厂模型的创建是为了尽可能晚地将应用程序与数据库和其他扩展绑定在一起。这就是为什么在create_app函数应用程序初始化,绑定到数据库和视图被注册的原因。

因此,如果您尝试使用db中的app对象,该对象已初始化但尚未绑定到应用(因为此整个视图已在create_app函数中注册并且只要查看尝试使用您的代码导入文件,您的代码就会被执行)它会抛出异常。

解决方案?您应该在视图中使用db对象,并使用为您制作的默认session。请参阅回购中的app/admin/views,您已将其链接以供参考。

如果您想自己玩Flask和SQLAlchemy,那么您应该从头开始使用自己的最小应用程序,并在确定它们符合您的需求时使用精心定制的特定实现。