我最近更新了Flask,现在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.
发布于 2022-10-05 14:50:28
从Flask-SQLAlchemy3.0开始,所有对db.engine
(和db.session
)的访问都需要一个活动的Flask应用程序上下文。db.create_all
使用db.engine
,因此它需要一个应用程序上下文。
with app.app_context():
db.create_all()
当Flask处理请求或运行CLI命令时,上下文将自动推送。您只需要手动将其中一个推送到这些情况之外,例如在设置应用程序时。
您也可以在shell中手动调用它,而不是在代码中调用create_all
。使用flask shell
启动已经具有应用程序上下文和导入db
对象的Python。
$ flask shell
>>> db.create_all()
或者,如果使用普通的python
外壳程序,则手动推送上下文。
$ python
>>> from project import app, db
>>> app.app_context().push()
>>> db.create_all()
发布于 2022-10-12 13:01:55
发布于 2022-11-20 10:31:36
我花了好几个小时自己想办法解决这个问题。成功后,我觉得我应该做一个详细的文章,一个又一个例子。
使用下面的示例代码创建一个model.py
:
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)
def db_drop_and_create_all(app):
with app.app_context():
db.drop_all()
db.create_all()
现在,在您的server.py
或app.py
中,不管您选择的名称是什么,导入相应的脚本如下:
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
安装用于此练习的所有依赖项
https://stackoverflow.com/questions/73961938
复制相似问题