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

Django 2+Python3.6远程MySQL测试库创建失败求助

解决Django单元测试时自动创建测试数据库的问题

我之前也碰到过类似的情况,结合你的问题细节,给你几个可行的解决方向:

1. 检查DATABASES配置里的TEST参数

先确认你的settings.py中数据库配置的TEST部分是否正确,Django默认会自动创建test_前缀的数据库,但有时候需要明确配置确保这个行为生效:

DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.mysql',
        'NAME': '<db>',
        'USER': 'your_db_user',
        'PASSWORD': 'your_password',
        'HOST': 'remote_mysql_host',
        'PORT': '3306',
        'TEST': {
            'NAME': 'test_<db>',  # 明确指定测试库名称,不指定也会默认生成test_前缀的库
            'CREATE_DB': True,    # 强制开启自动创建测试库(Django 2.x默认是True,但最好显式声明)
        }
    }
}

2. 确认远程MySQL用户有创建数据库的权限

虽然你说权限配置正确,但再仔细核对下:你的远程数据库用户必须拥有CREATE权限,否则Django无法自动创建test_<db>库。可以登录远程MySQL执行以下命令检查:

SHOW GRANTS FOR 'your_db_user'@'your_local_ip';

如果输出里没有CREATE权限,就给用户授权:

GRANT CREATE ON *.* TO 'your_db_user'@'your_local_ip';
FLUSH PRIVILEGES;

3. 强制Django重新创建测试库并执行迁移

有时候残留的测试库会导致表未正确生成,这时候可以先手动删除旧的测试库,再重新运行测试:

# 登录远程MySQL删除旧测试库
mysql -u your_db_user -p -h remote_mysql_host
DROP DATABASE test_<db>;
EXIT;

# 运行测试,Django会自动创建新的测试库并执行迁移
python manage.py test

如果不想手动删库,也可以直接运行测试时不带--keepdb参数(这个参数会保留现有测试库,可能导致旧问题残留):

python manage.py test --noinput

4. 排查自定义测试运行逻辑的干扰

如果你在settings.py里配置了自定义的TEST_RUNNER,要确保它继承了默认的DiscoverRunner,并且没有修改测试数据库的创建逻辑。默认的测试运行器会自动处理数据库创建和迁移,自定义的话容易踩坑。

另外,从你的错误信息Table 'test_<db>.<db>' doesn't exist来看,大概率是测试库已经被创建,但对应的表没生成——这通常是迁移没被自动执行导致的,按照上面的步骤重新运行测试应该就能解决。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.20 09:10:24