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

如何用自定义TestRunner让Django 2测试连接现有SQL Server数据库?

解决Django 2测试复用现有SQL Server数据库的TestRunner问题

你遇到的AttributeError是因为DiscoverRunner实例本身并没有connections属性,你需要直接使用Django提供的数据库连接模块,同时还要正确返回测试数据库配置,这样Django的测试框架才能正常识别并使用现有数据库。

下面是修改后的ExistingDbTestRunner代码,完全适配你的需求:

from django.test.runner import DiscoverRunner
from django.db import connections

class ExistingDbTestRunner(DiscoverRunner):
    """测试时复用现有数据库,不创建/销毁测试库"""

    def setup_databases(self, **kwargs):
        # 直接使用settings中配置的default数据库
        connection = connections['default']
        # 确保连接已建立
        if not connection.is_usable():
            connection.connect()
        
        # 需要返回测试数据库的配置结构,Django测试框架依赖这个返回值
        return (
            [('default', connection.settings_dict, True, False)],
            False,
        )

    def teardown_databases(self, old_config, **kwargs):
        # 不需要销毁数据库,直接pass
        pass

关键修改点说明:

  • 导入django.db.connections来获取数据库连接,而不是试图从runner实例获取connections属性,这是你之前出错的核心原因。
  • 添加了连接可用性检查connection.is_usable(),避免重复连接或连接失效的问题。
  • 正确返回了Django测试框架需要的配置元组:第一个元素是包含数据库配置的列表(格式为(别名, 配置字典, 是否是镜像, 是否创建了数据库)),第二个元素表示是否是并行测试模式(这里设为False即可)。

额外配置提示:

为了确保测试不会污染你的生产副本数据库,建议在settings中单独配置测试数据库指向这个副本(而不是直接用生产库),比如:

# settings.py
DATABASES = {
    'default': {
        # 生产数据库配置
    },
    'test': {
        # 生产副本数据库配置,和default结构一致
        'ENGINE': 'sql_server.pyodbc',
        'NAME': 'your_prod_copy_db',
        'USER': 'your_test_user',
        # 其他SQL Server相关配置...
    }
}

然后在TestRunner里指定使用test连接,或者直接在运行测试时通过命令行指定:

python manage.py test --testrunner=your_app.tests.ExistingDbTestRunner --database=test

这样就能确保测试完全复用你指定的现有数据库,不会创建新的测试库,也不会在测试结束后销毁数据。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.28 09:53:44