Django多租户执行migrate_schemas报KeyError: 'prune'问题求助
问题根因
该报错由Django与django-tenants版本不兼容触发,和本次模型字段调整、迁移文件内容没有关联:
- Django 4.1及以上版本为原生
migrate命令新增了--prune启动参数,执行逻辑中会直接读取options["prune"]判断是否需要清理已不存在的迁移记录 - 当前环境安装的django-tenants版本过低,其内部封装的
migrate_schemas命令调用原生迁移逻辑时,传入的参数字典未包含prune键,直接触发键不存在的KeyError - 回滚模型变更、使用全新空库仍复现问题的原因是:报错发生在迁移流程正式启动前的参数读取阶段,根本没走到迁移文件解析、数据库操作的步骤,和业务侧的迁移内容完全无关。
修复方案
按优先级选择任意一种即可解决:
- 优先升级django-tenants至兼容Django 4.1+的正式版本,升级完成后无需修改业务代码,直接执行
./manage.py migrate_schemas即可正常运行,这是长期有效的根治方案 - 若暂时无法升级django-tenants,可做应急修复:找到虚拟环境路径下的
django_tenants/migration_executors/base.py文件,在调用原生MigrateCommand的代码前补全缺失的参数默认值:
# 原代码第53行前新增一行 options.setdefault("prune", False) MigrateCommand(stdout=stdout, stderr=stderr).execute(*args, **options)
该方案属于直接修改第三方依赖源码的临时操作,后续升级依赖时修改会被覆盖,仅适合应急场景使用
- 若无法升级django-tenants也不想修改依赖源码,可将Django回退至4.0.x及更早未引入
--prune参数的版本,该方案需要评估Django版本降级带来的安全补丁缺失、功能不兼容问题,非必要不选择。
校验方法
修复完成后先执行./manage.py migrate_schemas --help,如果输出的帮助信息参数列表中包含--prune选项,再正式执行迁移命令就不会再触发该KeyError。
内容的提问来源于stack exchange,提问作者Alfonso Irarrázaval
相关产品推荐
相关产品推荐

