Django多数据库下运行模型单元测试报数据库查询不允许错误
问题根因
Django 从2.2版本开始为多数据库场景新增了测试访问隔离机制:继承TestCase的测试类默认仅允许操作default数据库,任何对其他数据库的读写请求都会直接抛出断言错误,防止测试逻辑意外污染非测试数据源。
你的User模型路由到了base数据库,测试类没有显式声明允许访问该库,就触发了这个报错——其实报错信息本身已经给出了修复方向,只是没说明具体写法。
注意:你贴出的DATABASES配置本身存在多处语法错误,修复测试问题前请先修正,否则项目本身无法正常启动:
- 多个配置键值对末尾缺失逗号分隔
- 多处字符串配置值缺失闭合单引号
base库的HOST配置值拼写错误,locahost应为localhost
修复方案
在测试类中添加databases类属性,将测试过程中会访问的所有数据库名称加入集合即可。修改后的测试代码如下:
from django.test import TestCase from base.models import User class UserModelTest(TestCase): # 声明当前测试类允许访问的数据库,按需添加即可 databases = {"base", "default"} @classmethod def setUpTestData(cls): User.objects.create(first_name='Big', last_name='Bob') def test_first_name_label(self): author = User.objects.get(id=1) field_label = author._meta.get_field('first_name').verbose_name self.assertEqual(field_label, 'first name')
额外注意事项
- 如果测试逻辑同时涉及
auth_db库的读写(比如调用了鉴权相关的接口、操作了用户权限表),把auth_db也加入databases集合即可 - 如果项目中多数测试都需要访问多个数据库,可以自定义一个通用测试基类统一声明
databases配置,所有业务测试类继承该基类即可,无需重复编写配置 - 不建议直接设置
databases = "__all__"放开所有数据库权限,这会破坏测试隔离性,极端情况下可能误操作本地开发库甚至生产库的数据,只声明测试实际用到的库即可 - 运行Django测试不需要加
sudo,直接用当前登录用户执行python3 manage.py test即可,root权限反而可能导致测试数据库创建、文件读写的权限异常
内容的提问来源于stack exchange,提问作者Ivan Campelo
相关产品推荐
相关产品推荐

