【问题标题】:How to query data from real Database created by django-pytest db fixture如何从 django-pytest db 夹具创建的真实数据库中查询数据
【发布时间】:2021-04-12 13:16:26
【问题描述】:

我使用 pytest 为我的 django 项目编写与 db 相关的测试。我使用 db 夹具在数据库中创建记录。测试工作正常,但如何从真正的 Postgres 数据库中选择这些记录。当我尝试通过 PgAdmin 选择这些记录时,我得到空列表。能否请您解释一下 db fixture 的工作原理以及它在哪里存储记录?

【问题讨论】:

    标签: django pytest pytest-django


    【解决方案1】:

    pytest.mark.django_db 将整个测试包装在一个事务中(在测试结束时回滚),这在 pgadmin 中是不可见的。

    您可以尝试使用@pytest.mark.django_db(transaction=True) 在您的测试中启用测试事务。但是,它速度较慢,并且在测试后刷新数据库

    【讨论】:

    • 但是我尝试在测试中间停止调试过程并查询数据。 dgango-pytest db 是否从 settings.py 中获取数据库设置?
    【解决方案2】:

    在运行测试时,Django 会创建第二个临时数据库并在其中运行测试,因此它不会影响您的生产/开发数据库,​​并且您将始终获得相同的预测结果。

    最重要的是,根据每个测试的配置方式,Django 可以将测试包装在一个事务中,该事务将在特定测试完成后回滚,因此测试不会相互影响。

    如果你想在你的真实数据库中看到这些数据,在测试完成后,你必须配置你的测试,你希望它持久化,不被包装在事务中。当您使用pytest-django 时,有两种可能的方法来处理它,具体取决于您使用的测试套件的“风格”:

    • 如果您从django.test 使用TestCaseTransactionTestCase,则切换到SimpleTestCase。请注意,与此事务回滚一起,您将失去更多与数据库相关的功能。
    • 如果您使用的是pytest.mark.django_db,只需将其删除即可。

    对于单独的数据库,您可以在测试期间直接连接到它,也可以在运行测试时在命令行中添加--reuse-db,这样pytest-django 在测试完成后不会破坏它。这个单独的数据库只会在您的常规数据库名称中添加 test_ 前缀。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-06-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-06-04
      相关资源
      最近更新 更多