Flask 和 SQLAlchemy,应用程序未在实例上注册

问题描述 投票:0回答:2

我目前正在尝试拼凑一个小型 Flask 应用程序。这是我的结构。

run.py
application
  __init__.py
  database.py
  models.py
  views.py

database.py
仅包含 SQLAlchemy 对象:

db = SQLAlchemy()

然后我将其导入到我的

models.py
中以创建我的模型。最后,在
__init__.py
内部,我从
db
导入
database.py
并执行以下操作:

from .database import db
from flask import Flask
app = Flask(__name__)
app.config['SQLALCHEMY_DATABASE_URI'] = 'sqlite:///application.db'
db.init_app(app)
db.create_all()

但是,我无法从显示的模型创建表格。如果我删除

db.create_all()
。应用程序将毫无问题地运行,但显然数据库尚未创建。当
db.create_all()
出现时,我会收到“运行时错误:应用程序未在数据库实例上注册,并且没有应用程序绑定到当前上下文”。

老实说,我很困惑,就像以前一样,我在不创建数据库的情况下启动应用程序时遇到了问题,但将

db
移动到它自己的文件似乎以某种方式纠正了这个问题。现在,唯一剩下的问题是实际创建数据库。

谁能告诉我可能是什么问题?我真的被难住了。

python flask sqlalchemy flask-sqlalchemy
2个回答
11
投票

答案在这里:http://flask-sqlalchemy.pocoo.org/latest/api/#configuration

请参阅以下部分:

两者之间的区别在于,在第一种情况下,像 create_all() 和 drop_all() 这样的方法将始终有效,但在第二种情况下,flask.Flask.request_context() 必须存在。

这里有更多信息:http://flask-sqlalchemy.pocoo.org/latest/contexts/

如果这一切令人困惑(可能是这样,因为它谈论的是 Flask 的一个相当高级的功能),简短的版本是

db.init_app(app)
更改了
app
对象,但它不会改变
db
中的任何内容目的。这是故意的,因为可能会有不止一个
app
飞来飞去,而
db
可能必须与所有人交谈。 (我说这是一个高级功能。)

因此,当您在没有实时请求的情况下调用

db.create_all()
(这会创建一个具有当前正在运行的
app
的全局)时,它不知道要连接到什么,并且会发生爆炸。这就是错误的含义。

在你的情况下,我会将 SQLAlchemy 回调放回

__init__.py
并将
app
传递给它,这是最简单的方法:

db = SQLAlchemy(app)

或者保持原样,并在第一个请求之前运行设置:

@app.before_first_request
def create_database():
     db.create_all()

希望有帮助!如果您遇到任何问题,请告诉我。


0
投票

同样的问题刚刚解决了。我的模型位于 models.py 中,并将其导入到 app.py 中。所以现在我的模型位于我的 app.py 中。我真的不明白为什么它有效,但它有效,但不是最干净的分辨率

© www.soinside.com 2019 - 2024. All rights reserved.