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
相关产品推荐
相关产品推荐

