如何使用connections连接Django测试数据库?报错求助
嘿,我来帮你搞定这个测试数据库连接的麻烦!你碰到的KeyError: 'auto_tests',核心是对Django测试时的数据库机制有点误解,咱们一步步理清楚:
核心原因:Django测试数据库的自动切换逻辑
当你运行Django测试时,框架会自动帮你切换到测试数据库,但它不会给测试数据库新增一个独立的connections别名。哪怕你在settings里指定了测试库的名称,测试期间原来的default(或你定义的其他数据库别名)已经自动指向测试数据库了——你完全不需要用connections['test_name_of_main_db']这种自定义别名去连接。
举个配置示例,假设你的settings是这么写的:
DATABASES = { 'default': { 'ENGINE': 'django.db.backends.mysql', 'NAME': 'main_db', 'USER': 'root', 'PASSWORD': 'your_password', # 指定测试数据库名称 'TEST': { 'NAME': 'test_main_db', } } }
当你执行python manage.py test时,Django会自动使用test_main_db作为测试库,但你依然用connections['default'].cursor()来操作,而不是connections['test_main_db']。
正确的操作方式
1. 测试用例中直接使用原数据库别名
在测试代码里,直接调用你平时用的数据库别名(比如default)就能操作测试数据库:
from django.db import connections from django.test import TestCase class MyDatabaseTestCase(TestCase): def test_test_db_connection(self): # 这里的default已经自动指向测试数据库 cursor = connections['default'].cursor() # 执行测试SQL cursor.execute("SELECT 1;") result = cursor.fetchone() self.assertEqual(result[0], 1)
2. 非测试场景手动连接测试数据库
要是你想在测试之外的环境手动连接测试库,得在settings里新增一个数据库配置项,把测试库的信息单独写进去:
DATABASES = { 'default': { # 主库配置 }, 'test_main_db': { 'ENGINE': 'django.db.backends.mysql', 'NAME': 'test_main_db', 'USER': 'root', 'PASSWORD': 'your_password', 'HOST': 'localhost', 'PORT': '3306', } }
之后就可以用connections['test_main_db'].cursor()来连接了,但记得先手动创建这个数据库,或者用python manage.py migrate --database=test_main_db初始化表结构。
为什么会出现KeyError: 'auto_tests'?
这个错误说明你尝试使用的别名auto_tests并没有在Django的connections注册表中存在——大概率是你误写了别名,或者错误地认为测试数据库会自动生成新的别名,但实际上Django并不会这么做。
内容的提问来源于stack exchange,提问作者Beliaf

