首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >烧瓶-SQLAlchemy db.create_all()会引发在应用程序上下文之外工作的RuntimeError

烧瓶-SQLAlchemy db.create_all()会引发在应用程序上下文之外工作的RuntimeError
EN

Stack Overflow用户
提问于 2022-10-05 14:29:16
回答 3查看 6K关注 1票数 14

我最近更新了Flask,现在db.create_all正在提高RuntimeError: working outside of application context。我怎么叫create_all

代码语言:javascript
复制
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()

这将引发以下错误:

代码语言:javascript
复制
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.
EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2022-10-05 14:50:28

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

代码语言:javascript
复制
with app.app_context():
    db.create_all()

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

您也可以在shell中手动调用它,而不是在代码中调用create_all。使用flask shell启动已经具有应用程序上下文和导入db对象的Python。

代码语言:javascript
复制
$ flask shell
>>> db.create_all()

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

代码语言:javascript
复制
$ python
>>> from project import app, db
>>> app.app_context().push()
>>> db.create_all()
票数 28
EN

Stack Overflow用户

发布于 2022-10-12 13:01:55

如果使用的是python外壳而不是flask shell,则可以手动推送上下文。flask shell会帮你处理的。

代码语言:javascript
复制
>>> from project import app, db
>>> app.app_context().push()
>>> db.create_all()

了解有关酒瓶文档这段视频中的应用程序上下文的更多信息。

票数 1
EN

Stack Overflow用户

发布于 2022-11-20 10:31:36

我花了好几个小时自己想办法解决这个问题。成功后,我觉得我应该做一个详细的文章,一个又一个例子。

使用下面的示例代码创建一个model.py

代码语言:javascript
复制
from flask_sqlalchemy import SQLAlchemy
import datetime
from flask_marshmallow import Marshmallow
from secret import path

database_path = path 

db = SQLAlchemy()


'''
setup_db(app)
    binds a flask application and a SQLAlchemy service
'''
def setup_db(app, database_path=database_path):
    app.config["SQLALCHEMY_DATABASE_URI"] = database_path
    app.config["SQLALCHEMY_TRACK_MODIFICATIONS"] = False
    db.app = app
    db.init_app(app)
    

'''
db_drop_and_create_all()
    drops the database tables and starts fresh
    can be used to initialize a clean database
    !!NOTE you can change the database_filename variable to have multiple verisons of a database
'''

def db_drop_and_create_all(app):
    with app.app_context():
        db.drop_all()
        db.create_all() 
  

class Articles(db.Model):
    __tablename__ = "articles"
    id = db.Column(db.Integer, primary_key=True)
    title = db.Column(db.String(100))
    body = db.Column(db.Text())
    date = db.Column(db.DateTime, default = datetime.datetime.now)
    
    
    def __init__(self, title, body):
        self.name = title
        self.body = body
    
    
    def __repr__(self):
        return f"articles(title = {title}, body = {body}, date = {date})"

model.py中,请注意助手函数db_drop_and_create_all(app)

代码语言:javascript
复制
def db_drop_and_create_all(app):
    with app.app_context():
        db.drop_all()
        db.create_all()

现在,在您的server.pyapp.py中,不管您选择的名称是什么,导入相应的脚本如下:

代码语言:javascript
复制
from model import setup_db, Articles, db_drop_and_create_all
from flask_cors import CORS
from flask import Flask, jsonify

app = Flask(__name__)

setup_db(app)  
CORS(app)
db_drop_and_create_all(app)
  

 
@app.route('/', methods=['GET'])
def get_articles():
    return jsonify({"Hello":  "World"})



if __name__ == '__main__':
    app.run(debug=True)

专业提示:

对于此示例,Cors是可选的。

确保使用pip install dependencyName安装用于此练习的所有依赖项

票数 -1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/73961938

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档