首页 > 编程问答 >Django 测试设置错误:MySQL 后端的 django_content_type 表问题

Django 测试设置错误:MySQL 后端的 django_content_type 表问题

时间:2024-07-28 14:38:31浏览次数:18  
标签:python mysql django-migrations testcase django-tests

我在使用 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。

  1. 数据库设置:已删除并手动重新创建测试数据库以确保干净。

  2. SQL 模式:调整 SQL 模式设置以避免严格模式问题 (SET GLOBAL sql_mode = '';)。

  3. 迁移:所有迁移均已成功应用,经验证

  4. . python manage.py showmigrations --settings=bms.settings_test 显示迁移也包括此内容:

    contenttypes

    [X] 0001_initial

    [X] 0002_remove_content_type_name

    数据库配置:仔细检查 settings_test.py 以确保配置正确,包括正确的数据库名称和用户凭据。

  5. 其他信息:

测试设置期间似乎未正确创建或访问 django_content_type 表。 该错误不会在开发环境中发生,仅在测试期间发生。

期望:我期望当我运行

时,它应该创建所有必需的数据库设置并运行测试。但这并没有发生。它只创建数据库“test_usersdb”并创建下面提到的表,然后给出上述错误: python manage.py test --settings=bms.settings_test Tables_in_test_usersdb:

auth_group

  1. auth_group_permissions

  2. auth_permission

  3. django_migrations

  4. 问题: 在使用 MySQL 后端进行 Django 测试设置期间,是否有人遇到过类似的问题,即 django_content_type 表未创建或无法访问?我可以采取哪些额外步骤来解决此问题?任何见解或建议将不胜感激!

感谢您的帮助!

Thank you for your help!


问题的原因很可能是你在测试设置中使用了多个数据库,但在 TestCase 中没有正确配置 migrate_databases 属性。

当 Django 运行测试时,它会根据 DATABASES 设置创建测试数据库。如果你在 TestCase 中指定了 databases 属性,它只会迁移这些数据库中指定的数据库。在你的情况下,你指定了 'default' 'usersdb' ,但没有指定 'django_content_type' 表所在的数据库。

解决方法:

  1. 指定所有需要迁移的数据库: 在你的 TestCase 中,将 databases 属性修改为包含所有需要迁移的数据库,包括 django_content_type 所在的数据库。例如,如果 django_content_type 'default' 数据库中,你需要这样配置:
from django.test import TestCase

class UserModelTests(TestCase):
    databases = {'default', 'usersdb'}  # 确保包含 'default'

    # ... 你的测试代码 ...
  1. 使用 migrate_databases 属性: 从 Django 4.1 开始,你可以使用 migrate_databases 属性来明确指定需要迁移哪些数据库。例如:
from django.test import TestCase

class UserModelTests(TestCase):
    migrate_databases = {'default', 'usersdb'}  # 只迁移这两个数据库

    # ... 你的测试代码 ...
  1. 不指定任何数据库: 如果你想迁移所有在 DATABASES 中配置的数据库,你可以不指定 databases migrate_databases 属性。
from django.test import TestCase

class UserModelTests(TestCase):
    # ... 你的测试代码 ...

确保你选择了适合你需求的方法,并将 django_content_type 表所在的数据库包含在内。这样就能解决 Django 测试时无法找到 django_content_type 表的问题。

标签:python,mysql,django-migrations,testcase,django-tests
From: 78803093

相关文章

  • 如何循环使用按钮输入,在python中的不同选项之间循环?
    我有一个循环,它采用三路开关输入并在相机开机时选择一个选项:#SetGPIOinputswitchColorOne=pyb.Pin("P9",pyb.Pin.IN,pyb.Pin.PULL_UP)switchColorTwo=pyb.Pin("P7",pyb.Pin.IN,pyb.Pin.PULL_UP)#SetcolorpalletebyswitchifswitchColorOne.value()==0:......
  • SSL 证书验证失败 - 雅虎财经 API - Python
    我正在尝试从雅虎财经获取数据,但收到SSL错误。代码如下:importrequestsresponse=requests.get("https://query1.finance.yahoo.com/v8/finance/chart/META",verify=True)print(response.status_code)出现以下错误:urllib3.exceptions.SSLError:[SSL:CERTIFICATE_......
  • 【学习笔记】Matlab和python双语言的学习(熵权法)
    提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档文章目录前言一、熵权法的基本概念二、熵权法的基本步骤1、构建决策矩阵2、数据标准化3、计算指标的比重4、计算信息熵5、计算权重6、计算综合得分三、代码实现----Matlab四、代码实现----python总结......
  • MySQL基础练习题9-平均售价
    题目·:查找每种产品的平均售价。average_price 应该 四舍五入到小数点后两位。准备数据​分析数据第一步:用左连接连接两张表​第二步:留下符合日期第三步:算平均售价第四步:排除那些售卖为0的这种情况总结:题目:查找每种产品的平均售价。average_price 应该 四舍五入到......
  • 【python】网络通信编程例子
    以下是一个简单的Python示例,展示了如何在Linux下使用套接字进行基本的网络通信,包括创建服务器和客户端。服务器端代码importsocket#创建一个IPv4TCP套接字server_socket=socket.socket(socket.AF_INET,socket.SOCK_STREAM)#绑定服务器地址和端口server_addr......
  • 如何将Python版本从3.9降级到3.7?
    我正在开发RaspberryPi。这些是我的操作系统信息:pi@raspberrypi:~$uname-marmv7lpi@raspberrypi:~$cat/etc/os-releasePRETTY_NAME="RaspbianGNU/Linux11(bullseye)"NAME="RaspbianGNU/Linux"VERSION_ID="11"VERSION="11(bullseye)......
  • Python终端输出彩色字符方法
    colorama是一个python专门用来在控制台、命令行输出彩色文字的模块,完全兼容linux和windows各个版本。 1.Python3.x中安装colorama模块: pipinstallcolorama'''可用格式常数:【颜色RED,GREEN都需要大写】Fore:BLACK,RED,GREEN,YELLOW,BLUE,MAGENTA,CYAN,WHI......
  • 我无法安装 pygame 模块,所以我尝试观看视频,它告诉我这样做。在那个视频中他得到了 pyt
    c:\User\admin>piplistSyntaxError:unexpectedcharacterafterlinecontinuationcharacter我试图获取python模块列表,但出现语法错误出现SyntaxError:unexpectedcharacterafterlinecontinuationcharacter错误是因为你的用户名中包含一个特殊字符......
  • python第五节--conda命令
    这里写自定义目录标题基本命令环境管理包管理环境文件环境变量Conda配置高级操作常见问题基本命令检查Conda版本:conda--version更新Conda:condaupdateconda环境管理创建新环境:condacreate--namemyenv创建包含特定Python版本的新环境:conda......
  • 如何使用python向另一台计算机发送请求
    基本上我有一个聊天室,我将把它变成一个网络(我知道这听起来没有多大意义),但基本上我想知道是否可以让python脚本捕获计算机上的所有传出请求并将其发送到另一台计算机(c2)。然后我希望c2自己发出请求。这是对我正在做的事情的淡化解释,但任何帮助都会很棒!当然可以!虽然从头......