执行flask db init时出现KeyError: <flask.cli.ScriptInfo>错误求助
解决Flask-Migrate执行
flask db init时的KeyError问题 看起来你遇到的问题是Flask CLI调用create_app时传递的参数不符合预期导致的KeyError,我来帮你一步步解决这个问题。
错误原因分析
当你运行flask db init这类Flask CLI命令时,Flask会自动调用你的create_app函数,但默认情况下它传递的不是你预期的字符串配置名称(比如'development'),而是一个ScriptInfo对象。这就导致app_config[config_name]找不到对应的字典键,直接抛出了KeyError。
解决方案1:修改create_app函数,兼容CLI调用
你可以调整create_app的参数处理逻辑,让它能应对这种情况,比如给参数设置默认值,或者判断传入的是否是ScriptInfo对象:
首先在__init__.py顶部新增必要的导入,然后修改函数:
# app/__init__.py # third-party imports from flask import Flask from flask_sqlalchemy import SQLAlchemy from flask_login import LoginManager from flask_migrate import Migrate import os # 新增导入 import flask # 新增导入用于判断对象类型 # local imports from config import app_config # db variable initialization db = SQLAlchemy() login_manager = LoginManager() def create_app(config_name=None): # 如果没有传入配置名,或者传入的是ScriptInfo对象,就用环境变量或默认值 if config_name is None or isinstance(config_name, flask.cli.ScriptInfo): config_name = os.getenv('FLASK_ENV', 'development') app = Flask(__name__, instance_relative_config=True) app.config.from_object(app_config[config_name]) app.config.from_pyfile('config.py') db.init_app(app) login_manager.init_app(app) login_manager.login_message = "You must be logged in to access this page." login_manager.login_view = "auth.login" migrate = Migrate(app, db) from app import models # temporary route @app.route('/') def hello_world(): return 'Hello, World!' return app
这样修改后,不管是手动传入配置名,还是Flask CLI自动调用,都能正常获取到正确的配置名称。
解决方案2:通过环境变量指定create_app的参数
如果你不想修改代码,也可以在运行命令前,通过设置FLASK_APP环境变量来指定create_app的参数:
Windows命令行:
set FLASK_APP=app:create_app('development') flask db init
Windows PowerShell:
$env:FLASK_APP="app:create_app('development')" flask db init
Linux/macOS终端:
export FLASK_APP=app:create_app('development') flask db init
这样Flask CLI就会带着正确的配置名称调用create_app,不会再出现KeyError。
额外检查点
别忘了确认你的config.py里的app_config字典确实包含你指定的配置键(比如'development'),比如:
# config.py class DevelopmentConfig: DEBUG = True SQLALCHEMY_DATABASE_URI = 'sqlite:///your-db-name.db' # 其他配置项... app_config = { 'development': DevelopmentConfig, # 可以按需添加production、testing等配置类 }
如果app_config里没有对应的键,即使传递了正确的名称也会报错哦。
内容的提问来源于stack exchange,提问作者EJ Singh
相关产品推荐
相关产品推荐

