我在使用 MySQL 后端设置 Django 测试时遇到问题。该错误发生在测试数据库设置阶段,特别与 django_content_type 表相关。详细信息如下:
环境:
-
Django版本:5.0.7
-
MySQL版本:8.0.37
-
操作系统:Ubuntu 20.04
-
Python版本:3.11.12
错误:
当我运行
python manage.py test --settings=bms.settings_test
(bms是我的项目名称)时,我收到以下错误:
django.db.utils.OperationalError:(1824,“无法打开引用的表'django_content_type'”)| ||[settings_test.py]
[test_users.py]
from .settings import *
DATABASES = {
"default": {
"ENGINE": "django.db.backends.mysql",
"NAME": "usersdb",
"USER": "test_user",
"PASSWORD": "test_password",
"HOST": "10.128.0.9", # private ip add of database server
"PORT": "3306",
},
}
采取的步骤:
from django.test import TestCase
from users.models import Users
class UserModelTests(TestCase):
databases = {'default', 'usersdb'}
@classmethod
def setUpTestData(cls):
# Setup non-modifiable test data
cls.user = Users.objects.create_user(
username='testuser',
email='[email protected]',
password='secret'
)
def test_user_creation(self):
user = Users.objects.get(username='testuser')
self.assertEqual(user.email, '[email protected]')
self.assertTrue(user.check_password('secret'))
def test_user_string_representation(self):
user = Users.objects.get(username='testuser')
self.assertEqual(str(user), user.username)
权限:确认 test_user 拥有所有必要的权限,包括 CREATE、ALTER 和 DROP。
-
数据库设置:已删除并手动重新创建测试数据库以确保干净。
-
SQL 模式:调整 SQL 模式设置以避免严格模式问题 (SET GLOBAL sql_mode = '';)。
-
迁移:所有迁移均已成功应用,经验证
-
.
python manage.py showmigrations --settings=bms.settings_test
显示迁移也包括此内容:contenttypes
[X] 0001_initial
[X] 0002_remove_content_type_name
数据库配置:仔细检查 settings_test.py 以确保配置正确,包括正确的数据库名称和用户凭据。
-
其他信息:
测试设置期间似乎未正确创建或访问 django_content_type 表。 该错误不会在开发环境中发生,仅在测试期间发生。
期望:我期望当我运行
时,它应该创建所有必需的数据库设置并运行测试。但这并没有发生。它只创建数据库“test_usersdb”并创建下面提到的表,然后给出上述错误:
python manage.py test --settings=bms.settings_test
Tables_in_test_usersdb:
auth_group
-
auth_group_permissions
-
auth_permission
-
django_migrations
-
问题: 在使用 MySQL 后端进行 Django 测试设置期间,是否有人遇到过类似的问题,即 django_content_type 表未创建或无法访问?我可以采取哪些额外步骤来解决此问题?任何见解或建议将不胜感激!
感谢您的帮助!
Thank you for your help!
问题的原因很可能是你在测试设置中使用了多个数据库,但在
TestCase
中没有正确配置
migrate_databases
属性。
当 Django 运行测试时,它会根据
DATABASES
设置创建测试数据库。如果你在
TestCase
中指定了
databases
属性,它只会迁移这些数据库中指定的数据库。在你的情况下,你指定了
'default'
和
'usersdb'
,但没有指定
'django_content_type'
表所在的数据库。
解决方法:
-
指定所有需要迁移的数据库:
在你的
TestCase
中,将databases
属性修改为包含所有需要迁移的数据库,包括django_content_type
所在的数据库。例如,如果django_content_type
在'default'
数据库中,你需要这样配置:
from django.test import TestCase
class UserModelTests(TestCase):
databases = {'default', 'usersdb'} # 确保包含 'default'
# ... 你的测试代码 ...
-
使用
migrate_databases
属性: 从 Django 4.1 开始,你可以使用migrate_databases
属性来明确指定需要迁移哪些数据库。例如:
from django.test import TestCase
class UserModelTests(TestCase):
migrate_databases = {'default', 'usersdb'} # 只迁移这两个数据库
# ... 你的测试代码 ...
-
不指定任何数据库:
如果你想迁移所有在
DATABASES
中配置的数据库,你可以不指定databases
或migrate_databases
属性。
from django.test import TestCase
class UserModelTests(TestCase):
# ... 你的测试代码 ...
确保你选择了适合你需求的方法,并将
django_content_type
表所在的数据库包含在内。这样就能解决 Django 测试时无法找到
django_content_type
表的问题。