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

Django单元测试:指定待修改数据库及解决数据库连接错误方法问询

问题1:Django单元测试场景下,应如何指定需要执行修改操作的数据库?

在Django的单元测试里,要是你需要针对特定数据库执行修改操作,主要有这么几种实用的方式:

  • 直接在操作里指定数据库:不管是创建、更新还是删除数据,ORM操作都支持通过using()方法指定目标数据库别名。举个例子:

    # 往名为"secondary"的数据库新增一条记录
    MyModel.objects.using("secondary").create(name="测试数据")
    # 更新该数据库里的指定记录
    MyModel.objects.using("secondary").filter(id=1).update(name="更新后的数据")
    
  • 给测试类全局声明允许操作的数据库:如果你的整个测试类都要和某个(或多个)非默认数据库交互,可以在测试类里定义databases属性,把需要操作的数据库别名列进去。比如:

    from django.test import TestCase
    
    class MultiDBTest(TestCase):
        # 允许测试操作default和secondary两个数据库
        databases = ["default", "secondary"]
    
        def test_update_secondary_db(self):
            MyModel.objects.using("secondary").create(name="测试")
            # 这里的修改操作会被允许,因为已经在databases里声明过了
    
  • 事务型测试的注意点:如果你用的是TransactionTestCase(而非默认的TestCase),事务的处理逻辑会略有不同,但指定数据库的方式还是一样的——要么用using()临时指定,要么在测试类里设置databases全局生效。


问题2:解决Django测试中“Database connections to {blah} are not allowed in this test...”的错误

这个错误其实是Django的测试隔离机制在保护你的测试环境:默认情况下,测试只允许连接default数据库,要是你在测试里访问了其他未声明的数据库,就会触发这个提示。解决方法分几种情况:

  • 最直接的方案:把目标数据库添加到测试类的databases属性:
    比如错误提示里提到的数据库别名是blah,那就在你的测试类里加上这个配置:

    class MyDBTest(TestCase):
        databases = ["default", "blah"]  # 把blah数据库加入允许列表
    
        def test_access_blah_db(self):
            # 现在连接blah数据库的操作就不会报错了
            MyModel.objects.using("blah").all()
    
  • 只读场景:用readonly选项声明:
    如果你只是要读取其他数据库的数据,完全不需要修改,可以用readonly标记该数据库,这样Django会确保不对它执行写操作,同时允许连接:

    from django.test import TestCase
    
    class ReadOnlyDBTest(TestCase):
        databases = {"default", "blah": {"readonly": True}}
    
        def test_read_blah_data(self):
            data = MyModel.objects.using("blah").all()
            # 只读操作完全没问题,要是尝试写操作会被Django拦截
    
  • 第三方库偷偷连接数据库的情况:
    有些第三方库可能会在内部自行建立数据库连接,这时候你可以用override_settings装饰器临时配置并允许该数据库:

    from django.test import TestCase, override_settings
    
    # 先临时配置blah数据库的连接信息
    @override_settings(DATABASES={"blah": YOUR_BLAH_DATABASE_CONFIG})
    class ThirdPartyLibTest(TestCase):
        databases = ["default", "blah"]
    
        def test_third_party_function(self):
            # 现在调用第三方库的函数,它连接blah数据库就不会报错了
            third_party_function_that_uses_blah()
    

内容的提问来源于stack exchange,提问作者Superpolock

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.06 08:12:30