冻结数据库以测试 Django 中的新功能

Posted

技术标签:

【中文标题】冻结数据库以测试 Django 中的新功能【英文标题】:Freezing database for testing new features in Django 【发布时间】:2017-09-17 04:49:02 【问题描述】:

在我的 Django 应用程序中,我想向现有模型添加几个字段,并可能创建一个新类。我只想测试新功能并批准它是否有效。

我可以使用 git 轻松还原代码。但是,如果我创建一个makemigrations+migrate,那么我的 mysql 数据库将会更改,并且反转更改看起来像手动删除表并使用像 django-admin migrate [app_label] [migration_name] 这样的命令恢复到旧状态(在某些情况下它看起来真的很麻烦, example)。

我想知道是否有任何安全的做法可以尝试操作数据库并将其安全地恢复到初始状态。

【问题讨论】:

如果你只有架构迁移,你只需要回滚你的迁移 - 你链接到的答案只是简单的废话顺便说一句,如果他不得不这样做,发布者一定把他的迁移搞得一团糟做他描述的事情。如果您也有数据迁移,那么您显然需要注意使它们可逆(使用“向上”和“向下”迁移代码)。 FWIW 我多年来一直在这样做(自从 South 实际上可用以来)没有任何问题。不必“手动”删除任何内容,也不必弄乱我的迁移文件。 它可能看起来很麻烦。但它不会搞砸任何事情.. 为什么不简单地复制你的数据库? 【参考方案1】:

可能的解决方案 #1:

您可以使用test database,在使用django.test.TestCase时创建:

需要数据库的测试(即模型测试)不会使用您的 “真实”(生产)数据库。创建单独的空白数据库 用于测试。

为您的项目创建一些单元测试并进行迁移(无需迁移到生产数据库,只需保留迁移)。那么:

如果数据库不存在,将首先创建它。任何 也将应用迁移以使其保持最新状态。

通常,数据库会在测试结束时销毁,但您可以在两次运行之间保留它:

您可以通过使用它们来防止测试数据库被破坏 test --keepdb 选项。这将保留测试数据库之间 运行。

通过这个技巧,您可以测试您在假数据库中所做的每个迁移,当您完成模型并且完成所有迁移历史记录时,您可以在生产数据库上migrate

可能的解决方案 #2:

您可以按照@albar 的建议制作数据库副本,并在进行新迁移时将其作为备份。

尽可能多地分解东西,当你设置完成后,用你的备份替换“受打击的”数据库,并将你的迁移历史应用到它。

【讨论】:

第一个解决方案部分是我正在寻找的。唯一棘手的部分是创建这些单元测试。这很麻烦,特别是如果我决定不进行更改。另外,据我所知,除了测试环境之外,我可能看不到它的影响。可能,我会使用第二种解决方案,但会寻找一种像 git revert 一样简单的方法来处理数据库。 如果您创建了良好的单元测试,您可以检查您所做的每一次更改(不仅是模型更改)项目的完整性,从长远来看这真的很有帮助。

以上是关于冻结数据库以测试 Django 中的新功能的主要内容,如果未能解决你的问题,请参考以下文章

Django 测试冻结在数据库创建

单元测试心跳功能

软冻结和硬冻结有什么区别?

如何在 django 中修复冻结的 cv2.imshow(来自 opencv)

测试中的模型 - Django 1.7 问题

Django 4.0 alpha 1 发布