首页 > 编程问答 >如何在 django pytest 中使用现有数据库?

如何在 django pytest 中使用现有数据库?

时间:2024-06-07 13:30:37浏览次数:28  
标签:django orm pytest web-api-testing pytest-django

我为我的 API 设置了默认模式,并为数据搜索设置了现有模式。这是数据库设置:

DATABASES = {
    "default":{
        "ENGINE": "django.db.backends.postgresql"、
        "OPTIONS":{"options": "-c search_path=public"}、
        "NAME":config("DB_NAME", default="")、
        "USER":config("DB_USER_NAME", default="")、
        "密码":config("DB_PASSWORD", default="")、
        "HOST":config("DB_HOST", default="db")、
        "端口":config("DB_PORT", default="")、
    },
    "data":{
        "ENGINE": "django.db.backends.postgresql"、
        "OPTIONS":{"options": "-c search_path=data"}、
        "NAME":config("DB_NAME", default="")、
        "USER":config("DB_USER_NAME", default="")、
        "密码":config("DB_PASSWORD", default="")、
        "HOST":config("DB_HOST", default="db")、
        "端口":config("DB_PORT", default="")、
    },
}
对于 "data",我使用了命令 python manage.py inspectdb --database=data > apps/data/models.py

得到的models.py是这样的:

class Product(models.Model):
    id = models.AutoField(primary_key=True)
    ...

    类 Meta
        managed = False
        db_table = "产品";
我试着创建了一些 pytest:
@pytest.mark.django_db(databases=["default", "data"], transaction=True)
class TestSomeTestAPIView:
    view_name = "some-view-name";

    def test_some_test_name(self, auth_client):
        print(Product.objects.using("data").all())

结果出现错误

"Product" 表不存在
因此,我需要使用现有的数据库模式"数据",而无需创建迁移,并像往常一样使用默认模式。

我试过 https://pytest-django.readthedocs.io/en/latest/database.html 但在我的情况下不起作用。您知道如何运行 pytests 吗?


错误信息 "Product" 表不存在 表明 Django 在错误的 schema 中查找该表。尽管已在数据库设置中正确配置了 data schema,但在运行测试时,Django 可能仍使用默认 schema。

以下是如何使用现有数据库 schema “data” 运行 pytest,而无需创建迁移并在 pytest 中使用 data 数据库连接:

1. 修改 models.py:

需要告诉 Django Product 模型位于 data schema 中。可以通过在 Product 模型的 Meta 类中指定 schema 属性来实现这一点:

class Product(models.Model):
    id = models.AutoField(primary_key=True)
    ...

    class Meta:
        managed = False
        db_table = '产品'
        schema = 'data'

2. 使用 pytest fixtures 设置数据库路由:

可以创建一个 pytest fixture 来临时修改数据库路由,以在测试期间使用 data schema:

import pytest

@pytest.fixture(scope='function')
def use_data_schema(settings):
    router = settings.DATABASE_ROUTERS[0]
    old_allow_migrate = router.allow_migrate

    def allow_migrate_data(self, db, app_label, model_name=None, **hints):
        if db == 'data':
            return True
        return old_allow_migrate(self, db, app_label, model_name, **hints)

    router.allow_migrate = allow_migrate_data
    yield
    router.allow_migrate = old_allow_migrate

@pytest.mark.django_db(transaction=True)
class TestSomeTestAPIView:
    view_name = "some-view-name"

    @pytest.mark.usefixtures('use_data_schema')
    def test_some_test_name(self, auth_client):
        print(Product.objects.using("data").all())

这个 fixture 做了以下事情:

  • 获取默认的数据库路由器。
  • 修改 allow_migrate 方法,允许在 data 数据库上进行迁移操作。
  • 在测试结束后,将 allow_migrate 方法恢复到原始状态。

3. 运行的测试:

现在,当运行 pytest 时,它应该能够找到 data schema 中的 Product 表。确保使用 using("data") 来查询 Product 模型,以便 Django 使用正确的数据库连接。

其他注意事项:

  • 如果在 settings.py 中定义了自定义数据库路由器,则需要相应地调整 fixture。
  • 确保已为测试环境正确配置了数据库连接设置。

通过这些修改,应该能够使用现有的数据库 schema “data” 运行 pytest,而无需创建新的迁移。

标签:django,orm,pytest,web-api-testing,pytest-django
From: 78590076

相关文章

  • idea,webstorm切换远程仓库
    当有一个老的项目需要从新上传到一个新的git地址,或者上传到云效上面,可以参考1:首先把setting->VersionControl->directoryMappings下面的仓库删除2,如果发现菜单栏的vcs不显示,双击shift,输入Mainmenu   3:选择 CreateGitRepository,创建git本地仓库   选择......
  • 195、Django实战:从部署到运维,打造高效Web应用
    DjangoChannels:实现WebSocket与实时通信本文将向您介绍Python开发框架Django中的一个重要组件——DjangoChannels,它使得在Django中实现WebSocket通信变得轻而易举。通过阅读本文,您将了解WebSocket的概念、DjangoChannels的工作原理以及如何在实际项目中使用它来实现实时......
  • 197、加速Django应用:性能优化全攻略
    Python开发框架Django之性能优化:提高应用程序的运行速度本文将为大家介绍如何使用Python开发框架Django进行性能优化,以提高应用程序的运行速度。我们将探讨一系列的技巧和最佳实践,帮助你优化Django应用程序的性能,从而提供更好的用户体验。1.概述在当今的数字化时代,应用......
  • 199、扩展Django之力:第三方库集成指南
    Python开发框架Django之Django插件与扩展:第三方库的使用与集成本文将介绍如何在Django项目中使用和集成第三方库,以扩展Django的功能,提高开发效率。我们将讨论Django插件的概念,如何选择合适的第三方库,以及如何将第三方库集成到Django项目中。1.Django插件与扩展的概念在......
  • Meta最新路径搜索算法 Beyond A*: Better Planning with Transformers via Search Dyn
    这篇论文前两个月刚刚放出,研究了如何让人工智能(AI)更好地解决复杂的规划问题,比如在迷宫中寻找最短路径,或者推箱子游戏(Sokoban)中把箱子全部推到指定位置。传统上,这类问题通常使用专门的规划算法来解决,比如A*搜索算法。但是,训练AI模型(如Transformer)来解决这些问题......
  • 【YOLOv8改进】DAT(Deformable Attention):可变性注意力 (论文笔记+引入代码)
    YOLO目标检测创新改进与实战案例专栏专栏目录:YOLO有效改进系列及项目实战目录包含卷积,主干注意力,检测头等创新机制以及各种目标检测分割项目实战案例专栏链接:YOLO基础解析+创新改进+实战案例摘要Transformers最近在各种视觉任务中展现出了优越的性能。较大甚至是......
  • 【转】【C#】电脑设置150%,Winform界面显示错乱
    在电脑设置150%的时候,winform下窗体布局会产生变化,如下图所示 解决方案1、打开注册表编辑器,找到下面这个路径:HKEY_CURRENT_USER\SOFTWARE\Microsoft\WindowsNT\CurrentVersion\AppCompatFlags\Layers如下图:2、在右侧新建一个字符串值。2.1值为:devenv.exe所在的路径(安装vs时......
  • FFmpeg结构体:AVInputFormat
    1.描述AVInputFormat是类似COM接口的数据结构,表示输入文件容器格式,着重于功能函数,一种文件容器格式对应一个AVInputFormat结构,在程序运行时有多个实例,位于avoformat.h文件中。2.结构体定义1typedefstructAVInputFormat{2/**3*Acommaseparated......
  • clang-format说明
    ---#语言:None,Cpp,Java,JavaScript,ObjC,Proto,TableGen,TextProtoLanguage: Cpp#BasedOnStyle: LLVM#访问说明符(public、private等)的偏移AccessModifierOffset: -4#开括号(开圆括号、开尖括号、开方括号)后的对齐:Align,DontAlign,AlwaysBreak(总是在开......
  • MatrixTransform之相关矩阵运算
    最近在学习MatrixTransform,发现对之前学的矩阵乘法竟然忘的一干二净,下面就是这个基础知识的整理。矩阵加法通常的矩阵加法被定义在两个相同大小的矩阵。两个m×n矩阵A和B的和,标记为A+B,一样是个m×n矩阵,其内的各元素为其相对应元素相加后的值。例如:也可以做矩阵的减法,只要其大......