python - 每次测试后如何重置 Django 测试数据库 ID?

标签 python django database shell docker

我有一个 Django 应用程序,我正在对它运行一些单元测试。所以我遇到的问题不是当一个测试插入测试数据库时。这是之后的测试。由于每个测试都没有保存事务,因此上一个测试的条目不存在这很好,尽管自动增量 ID 正在增加,就好像数据库中仍有条目一样。我需要解决这个问题,因为我在无法控制提供给它的 id 的地方插入更多数据,并且需要能够获取此特定数据以进行测试。如果我对代码进行硬编码以获取对象,则每次添加新测试时都必须更改代码,这是不理想的。

我有多个测试正在运行,但为了简单起见,我将显示两个。

from django.test import TestCase
from app.models import Model

class VersionMerge(TestCase):
   fixtures = ['initial_test_data.json']

   def test_model_test1(self):
       *Insert new data*
       *grab new data in*
       *Check data*

   def test_model_test2(self):
       *Insert new data*
       *grab new data*
       *Check data*

问题出现在 test_model_test2 中,当我尝试获取新数据时,我必须打印出对象以查看 id 才能获取它。

我有一个关于如何在实际数据库而不是测试数据库上修复此问题的解决方案。对于我的,我需要能够连接到 docker 容器并运行 psql 命令来重置 table_id_seq。

docker exec -t  $CONTAINER_ID psql --dbname=test_database_name -username=user -c "SELECT setval('modelName_appName_id_seq', 2, true)"

这将转到表格并将最后一个 id 值设置为 2 以使下一个 id 为 3。但是每当我尝试使用 python 从内部运行命令时

cmd = "command above"
os.system(cmd)

当我运行它时,出现以下错误。

sh: 1: docker: not found
sh: 1: docker: not found

寻求任何帮助,无论是问题的新解决方案还是对我的改进。

TLDR;我需要能够修改 Django 单元测试创​​建的数据库中的数据。

最佳答案

如果您需要测试来重置主键序列,您可以发出 RawSQL 查询来执行此操作。如何做到这一点在 this StackOverflow question 中得到了解答。 .

如果您使用的是 pytest,则可以使用更简单的选项。我们在所有 Django 项目中都使用 pytest 和 pytest-django,这让测试变得轻而易举。 pytest-django provdes a database fixture that can take a boolean parameter to reset the sequences .像这样使用它:

@pytest.mark.django_db(transaction=True, reset_sequences=True)
def mytest():
    [...]

关于python - 每次测试后如何重置 Django 测试数据库 ID?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51504144/

相关文章:

python - 如何将数组传递给 Scipy Interpolate RectBivariateSpline?

python - 静态文件未使用 Django 加载。 ( Bootstrap 不工作)

python - Django 麻烦 : django. setup() 抛出 "ImportError: No module named ' project_name'"

mysql - 文档管理系统的数据库结构是什么?

python - 为开发环境管理 PYTHONPATH

python - OpenCV 零填充

python - 有没有办法用 Python 创建 Eclipse 插件?

python - 将 django 页面共享给没有帐户的用户

php - 如何在 laravel 中使用一个选择选项发送多个数据?

mysql - 归档实时 MySQL 数据库的最佳方式