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

Python Flask和SQLAlchemy,应用程序未在实例上注册,python,flask,sqlalchemy,flask-sqlalchemy,Python,Flask,Sqlalchemy,Flask Sqlalchemy,我目前正在尝试拼凑一个小烧瓶应用程序。这是我的结构 run.py application __init__.py database.py models.py views.py database.py仅包含SQLAlchemy对象: db = SQLAlchemy() 然后我将其导入我的models.py以创建我的模型。最后,在\uuuu init\uuuu.py中,我从数据库.py导入db,并执行以下操作: from .database import db from flas

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

run.py
application
  __init__.py
  database.py
  models.py
  views.py
database.py
仅包含SQLAlchemy对象:

db = SQLAlchemy()
然后我将其导入我的
models.py
以创建我的模型。最后,在
\uuuu init\uuuu.py
中,我从
数据库.py导入
db
,并执行以下操作:

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\u all()
时,我会收到“RuntimeError:应用程序未在db实例上注册,并且没有应用程序绑定到当前上下文”

老实说,我很困惑,就像以前一样,我在启动应用程序而不创建数据库时遇到了问题,但是将
db
移动到它自己的文件似乎以某种方式纠正了这个问题。现在,唯一剩下的问题是实际创建数据库

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

答案如下:

请参阅关于以下内容的部分:

两者之间的区别在于,在第一种情况下,像create_all()和drop_all()这样的方法将一直工作,但在第二种情况下,flask.flask.request_context()必须存在

这里有更多信息:

如果所有这些都让人困惑的话(可能是的,因为它谈论的是Flask的一个相当高级的功能),那么简短的版本是
db。init_app(app)
更改
app
对象,但它不会更改
db
对象中的任何内容。这是故意的,因为可能会有多个
应用程序
四处飞来飞去,而
db
可能需要与所有应用程序进行对话。(我说这是一个高级功能。)

因此,当您在未激活请求的情况下调用
db.create_all()
时(这会创建一个当前正在运行的
应用程序的全局应用程序),它不知道要连接到什么,并且会爆炸。这就是错误的意思

在您的情况下,我会将SQLAlchemy调用放回
\uuuu init\uuuuu.py
并将
app
传递给它,这是最简单的方法:

db = SQLAlchemy(app)
或保持现状,并在第一次请求之前运行安装程序:

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

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

啊,我明白了。然而,我最终做的是将
app
导入到我的模型中,并在那里创建
db
对象。这似乎缓解了我所有的问题。你也可以这样做
db.create_all(app=app)
并将
app
参数设置为你当前的app这两个链接都断了:(链接文章的解释很好,我读了好几遍,但都不明白。