首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在创建测试数据库时禁用Django中的数据迁移

在创建测试数据库时禁用Django中的数据迁移
EN

Stack Overflow用户
提问于 2017-06-12 09:59:06
回答 5查看 5.7K关注 0票数 8

我有一个有相当数量迁移的应用程序,包括数据迁移,可以在一些模型上设置外键。

当我尝试运行tests.py时,它失败了,因为数据迁移正在查询数据库中不存在的数据。

有办法禁用数据迁移吗?(我希望保持模式迁移,而不是完全禁用迁移)。

或者在运行数据迁移之前从固定设备加载数据?

EN

回答 5

Stack Overflow用户

回答已采纳

发布于 2017-06-13 18:19:21

首先,我应该注意到,这个解决方案是一个肮脏的技巧:)

我认为,如果答案是True,您应该检查测试是否正在运行,并将数据迁移排除在执行之外。要检查测试是否正在运行,您可以定义自己的DiscoverRunner并设置一个变量,显示测试现在正在运行。

测试运行程序是一个定义run_tests()方法的类。Django附带了一个定义默认Django测试行为的DiscoverRunner类。这个类定义了run_tests()入口点,以及run_tests()用来设置、执行和删除测试套件的其他方法的选择。

例如,在设置中定义TEST_RUNNER。

代码语言:javascript
复制
from django.conf import settings
from django.test.runner import DiscoverRunner

class MyTestSuiteRunner(DiscoverRunner):
    def __init__(self, *args, **kwargs):
        settings.TEST_RUN = True
        super().__init__(*args, **kwargs)

TEST_RUNNER = 'project_name.test_settings.MyTestSuiteRunner'

那么,让我们假设您的应用程序中只有两个迁移:

  • 0001_initial.py
  • 0002_data_migration.py

因此,您应该在data_migration中检查测试是否正在运行,是否包括您的操作。

代码语言:javascript
复制
from your_app.settings import settings
class Migration(migrations.Migration):

    dependencies = [
        ('your_app', '0001_initial.py'),
    ]

    operations = [
        migrations.RunPython(data_migration_method),
    ] if not settings.TEST_RUN else []

再一次,我注意到,在我看来,这是一个肮脏的黑客,阅读它应该以一种适当的方式制作会很有趣,但是这个解决方案可能有助于解决您保存迁移依赖项的问题。请注意,您还可以在TEST_RUNNER中添加test_settings,运行您的测试,就像建议使用AR7一样。

还可以查看TEST_RUNNER文档(https://docs.djangoproject.com/en/1.11/topics/testing/advanced/#defining-a-test-runner)。我希望它能帮助你找到更好的解决方案。

另一种解决方案是使用django-pytest而不是标准的unittest模块。Pytest为测试Django应用程序和项目提供了一组有用的工具。它还有助于禁用Django迁移,并通过检查所有模型创建数据库。只需使用--名称标记来运行测试。阅读文档以获取更多信息(https://pytest-django.readthedocs.io/en/latest/database.html#nomigrations-disable-django-1-7-migrations)

票数 2
EN

Stack Overflow用户

发布于 2018-06-27 04:05:59

对于检查,测试是否正在运行:

代码语言:javascript
复制
'test' in sys.argv
票数 4
EN

Stack Overflow用户

发布于 2018-08-21 02:18:27

我受到在测试时禁用迁移@A.格林科的启发。我没有自定义TestRunner,我只是检查了django测试是否调用了0002_data_migration.py

代码:

代码语言:javascript
复制
class Migration(migrations.Migration):
dependencies = [
    ('backend', '0001_initial'),
]

operations = [
    migrations.RunPython(setup_data, rollback_setup, atomic=True)
] if 'test' not in sys.argv[1:] else []
票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/44496621

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档