gpt4 book ai didi

django - 如何对 Django 数据库迁移进行单元测试?

转载 作者:行者123 更新时间:2023-12-03 14:40:08 25 4
gpt4 key购买 nike

我们使用 django 迁移 (django v1.7+) 更改了我们的数据库。
数据库中存在的数据不再有效。

基本上我想通过在单元测试中测试迁移,构建迁移前数据库,添加一些数据,应用迁移,然后确认一切顺利。

怎么做:

  • 加载单元测试时阻止新的迁移

    我找到了 some stuff关于覆盖 settings.MIGRATION_MODULES但不知道如何使用它。当我检查时 executor.loader.applied_migrations它仍然列出了一切。我可以阻止新迁移的唯一方法是实际删除文件;不是我可以使用的解决方案。
  • 在 unittest 数据库中创建一条记录(使用旧模型)

    如果我们可以阻止迁移,那么这应该非常简单。 myModel.object.create(...)
  • 应用迁移

    我想我现在可能可以解决这个问题,因为我已经找到了 test_executor : 设置一个指向迁移文件的计划并执行它?嗯,对吗?有任何代码:-D
  • 确认数据库中的旧数据现在与新模型匹配

    同样,我希望这应该很简单:只需获取迁移前创建的实例并确认它已以所有正确的方式更改。

  • 所以挑战真的只是解决 如何防止 unittest 应用最新的迁移脚本 然后在我们准备好时应用它?

    也许我有错误的方法?我是否应该创建装置,并在最后确认它们都很好?是在应用迁移之前还是在它们全部完成之后加载夹具?

    通过使用 MigrationExecutor并使用 .migrate 挑选出特定的迁移我已经能够,也许?,将它回滚到特定状态,然后一个一个地向前滚动。但这令人怀疑;由于缺乏实际的 ALTER TABLE 指令,目前正在追逐 sqlite 捏造。陪审团还在外面。

    最佳答案

    我无法阻止单元测试从当前数据库模式开始,但我确实发现很容易恢复到迁移历史中的早期点:

    其中“0014_nulls_permitted”是迁移目录中的文件...

    from django.db.migrations.executor import MigrationExecutor
    executor.migrate([("workflow_engine", "0014_nulls_permitted")])
    executor.loader.build_graph()

    注意:运行 executor.loader.build_graphexecutor.migrate 的调用之间似乎是完成迁移并使事情按预期运行的一个非常重要的部分

    当前适用于数据库的迁移可以通过以下方式进行检查:
    print [x[1] for x in sorted(executor.loader.applied_migrations)]

    [u'0001_initial', u'0002_fix_foreignkeys', ... u'0014_nulls_permitted']

    我通过 ORM 创建了一个模型实例,然后通过直接运行一些 SQL 确保数据库处于旧状态:
    job = Job.objects.create(....)
    from django.db import connection
    cursor = connection.cursor()
    cursor.execute('UPDATE workflow_engine_job SET next_job_state=NULL')

    伟大的。现在我知道我有一个处于旧状态的数据库,并且可以测试正向迁移。所以 0016_nulls_banished 是一个迁移文件:
    executor.migrate([("workflow_engine", "0016_nulls_banished")])
    executor.loader.build_graph()

    迁移 0015 通过数据库将所有 NULL 字段转换为默认值。迁移 0016 更改了架构。您可以散布一些打印语句,以确认事情正在按照您的想法发生。

    现在测试可以确认迁移已经成功。在这种情况下,通过确保数据库中没有空值。
    jobs = Job.objects.all()
    self.assertTrue(all([j.next_job_state is not None for j in jobs]))

    关于django - 如何对 Django 数据库迁移进行单元测试?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37177041/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com