运行Pytest时测试数据库访问被拒绝报错如何解决
Pytest Django数据库访问报错排查指引
- 优先排查依赖版本变动
对比上周的Python依赖包版本,重点核对pytest-django、Django的版本号:pytest-django 4.0及以上版本收紧了多数据库访问限制,默认仅放行default数据库的访问,若你项目配置了名为test的非默认业务数据库,版本升级后会默认拦截对该库的所有查询请求。可执行pip list | grep pytest-django查看当前版本,和历史部署记录的版本做对比。 - 排查pytest配置变更
检查本地 pytest.ini、pyproject.toml 等配置文件中是否删除/修改了django_databases全局配置,或是执行pytest命令时新增了数据库相关的限制参数。如果原本配置的全局允许访问的数据库列表移除了test,就会触发全局报错。 - 排查fixture与测试用例的数据库标记
报错中触发问题的slugfixture依赖了默认的dbfixture,该fixture默认仅授权访问default数据库。如果TransactionCode模型通过数据库路由分配到了test库,需要额外配置数据库访问权限:- 单测试用例/ fixture 授权:添加标记
@pytest.mark.django_db(databases=["default", "test"]) - 全局授权:在pytest配置文件中添加如下配置:
[pytest] django_databases = default test - 单测试用例/ fixture 授权:添加标记
- 排查数据库路由规则变动
确认近期是否有代码修改了Django项目的DATABASE_ROUTERS路由逻辑,若原本路由到default库的业务模型被调整到了test库,也会触发该报错,不需要测试代码本身做改动。 - 快速验证方案
执行pytest命令时新增参数--no-db-restriction,若测试可正常运行,即可确认问题属于数据库访问限制触发,可进一步针对以上几点定位根因。
内容的提问来源于stack exchange,提问作者ViaTech
相关产品推荐
相关产品推荐

