You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.28 15:51:26