【问题标题】:Flask-SQLAlchemy db.create_all() raises RuntimeError working outside of application contextFlask-SQLAlchemy db.create_all() 在应用程序上下文之外引发 RuntimeError
【发布时间】:2022-10-17 21:08:37
【问题描述】:

我最近更新了 Flask-SQLAlchemy,现在 db.create_all 正在提高 RuntimeError: working outside of application context。如何拨打create_all

from flask import Flask
from flask_sqlalchemy import SQLAlchemy

app = Flask(__name__)
app.config['SQLALCHEMY_DATABASE_URI'] = 'sqlite:///project.db'
db = SQLAlchemy(app)

class User(db.Model):
    id = db.Column(db.Integer, primary_key=True)

db.create_all()

这会引发以下错误:

Traceback (most recent call last):
  File "/home/david/Projects/flask-sqlalchemy/example.py", line 11, in <module>
    db.create_all()
  File "/home/david/Projects/flask-sqlalchemy/src/flask_sqlalchemy/extension.py", line 751, in create_all
    self._call_for_binds(bind_key, "create_all")
  File "/home/david/Projects/flask-sqlalchemy/src/flask_sqlalchemy/extension.py", line 722, in _call_for_binds
    engine = self.engines[key]
  File "/home/david/Projects/flask-sqlalchemy/src/flask_sqlalchemy/extension.py", line 583, in engines
    app = current_app._get_current_object()  # type: ignore[attr-defined]
  File "/home/david/Projects/flask-sqlalchemy/.venv/lib/python3.10/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.

【问题讨论】:

    标签: python flask flask-sqlalchemy


    【解决方案1】:

    从 Flask-SQLAlchemy 3.0 开始,对db.engine(和db.session)的所有访问都需要一个活动的 Flask 应用程序上下文。 db.create_all 使用 db.engine,因此它需要一个应用上下文。

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

    当 Flask 处理请求或运行 CLI 命令时,会自动推送上下文。您只需要在这些情况之外手动推送一个,例如在设置应用程序时。


    除了在代码中调用 create_all 之外,您还可以在 shell 中手动调用它。使用flask shell 启动一个Python shell,它已经有一个应用上下文和db 对象导入。

    $ flask shell
    >>> db.create_all()
    

    或者,如果使用普通的 python shell,则手动推送上下文。

    $ python
    >>> from project import app, db
    >>> app.app_context().push()
    >>> db.create_all()
    

    【讨论】:

      【解决方案2】:

      如果您使用python shell 而不是flask shell,则可以手动推送上下文。 flask shell 将为您处理。

      >>> from project import app, db
      >>> app.app_context().push()
      >>> db.create_all()
      

      the Flask docsthis video 中了解有关应用程序上下文的更多信息。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2021-09-17
        • 2015-10-05
        • 1970-01-01
        • 2016-07-20
        相关资源
        最近更新 更多