升级Flask-SQLAlchemy后调用db.create_all()触发RuntimeError的解决方法
解决Flask-SQLAlchemy调用db.create_all()时的应用上下文错误
升级Flask-SQLAlchemy后,db.create_all()必须在Flask应用上下文中执行,否则会抛出Working outside of application context错误——因为该操作需要读取当前应用的数据库配置信息,而只有在应用上下文内,才能正确关联到你的Flask实例。
方法一:用应用上下文管理器包裹调用
直接修改代码,使用app.app_context()上下文管理器包裹db.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) # 包裹在应用上下文内执行表创建 with app.app_context(): db.create_all()
方法二:通过Flask CLI命令创建表(推荐生产环境使用)
编写CLI命令,利用Flask自带的上下文装饰器自动处理应用上下文,更符合工程化实践:
from flask import Flask from flask_sqlalchemy import SQLAlchemy from flask.cli import with_appcontext import click 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) # 定义CLI命令 @app.cli.command("create-tables") @with_appcontext def create_tables(): db.create_all() print("数据库表创建完成!")
执行时,在终端运行:
flask create-tables
内容的提问来源于stack exchange,提问作者Huzairi Haril
相关产品推荐
相关产品推荐

