python flask sqlalchemy 生成数据表报错

python flask sqlalchemy 生成数据表报错 求指教

报错内容:


Traceback (most recent call last):
  File "G:\studyProject\flaskBlog\app\models.py", line 195, in 
    db.create_all()
  File "G:\studyProject\flaskBlog\venv\lib\site-packages\flask_sqlalchemy\extension.py", line 884, in create_all
    self._call_for_binds(bind_key, "create_all")
  File "G:\studyProject\flaskBlog\venv\lib\site-packages\flask_sqlalchemy\extension.py", line 855, in _call_for_binds
    engine = self.engines[key]
  File "G:\studyProject\flaskBlog\venv\lib\site-packages\flask_sqlalchemy\extension.py", line 636, in engines
    app = current_app._get_current_object()  # type: ignore[attr-defined]
  File "G:\studyProject\flaskBlog\venv\lib\site-packages\werkzeug\local.py", line 513, in _get_current_object
    raise RuntimeError(unbound_message) from None
RuntimeError: Working outside of application context.

This typically means that you attempted to use functionality that needed
the current application. To solve this, set up an application context
with app.app_context(). See the documentation for more information.

参考GPT和自己的思路:根据 Traceback 内容,出现了一个“RuntimeError: Working outside of application context”的错误,这通常意味着你尝试使用需要当前应用程序的功能。为了解决这个问题,可以使用 Flask 提供的应用上下文(application context)。具体做法是,在调用 db.create_all() 前,加上下面的代码即可:

with app.app_context():
    db.create_all()

这样就可以在应用上下文环境中创建数据库了。另外,需要确保正确导入了 Flask 的 current_app 和 db 对象才能使用。

这个错误提示意味着您尝试使用需要当前应用程序的功能,但是没有为此设置应用程序上下文。这可能是因为您尝试在应用程序上下文之外创建数据库表。

在使用 Flask-SQLAlchemy 创建数据库表之前,需要将应用程序上下文激活。您可以通过以下方式激活应用程序上下文:

from flask import Flask
from flask_sqlalchemy import SQLAlchemy

app = Flask(__name__)
db = SQLAlchemy(app)

with app.app_context():
    db.create_all()

在这个例子中,我们使用 app.app_context() 将应用程序上下文包装在一个 with 语句中,以便在 db.create_all() 之前激活它。

如果您使用 Flask-Script 或 Flask-Migrate 等插件来管理数据库迁移,它们通常会自动处理应用程序上下文,您不需要手动处理。但是,如果您使用 Flask-SQLAlchemy 直接创建和管理数据库表,则需要手动处理应用程序上下文。

  • 这篇博客也许可以解决你的问题👉 :python flask sqlalchemy实现API,并解决复杂类的序列化
  • 除此之外, 这篇博客: python之flask_sqlalchemy的使用及详解中的 SQLAlchemy的回滚  部分也许能够解决你的问题, 你可以仔细阅读以下内容或跳转源博客中阅读:
  • 上面的代码可以看出我们是没有进行事务的操作的,但是SQLAlchemy天然的是支持事务的,所以我们在commit之前的代码都不会被真正的执行添加到数据库中的。但是上面代码还是有问题的,我们是没有进行数据的回滚(rollback)

    为什么一定要执行db.session.rollback(),是因为如果我们的程序执行到db.session.commit()这里出现了错误,又没有执行rollback的话,那么不仅仅是这次的插入失败了,后续的其他操作SQLAlchemy也是会失败的。所以建议大家一定要回滚起来!

    所以以后只要使用db.session.commit()就一定要用try except给包裹起来并在except里面执行db.session.rollback()