对于Django测试,我如何将keepdb与mariadb结合使用

时间:2018-10-10 18:35:14

标签: mysql django mariadb

我有一个包含很多非托管表的数据库,我正在将它们用于Django应用程序。为了进行测试,我想使用--keepdb选项,这样我就不必每次都重新填充这些表。我正在为数据库使用MariaDB。如果我不使用keepdb选项,则一切正常,测试数据库将被正确创建和销毁。

但是当我尝试运行测试以保留数据库时:

$ python manage.py test --keepdb

我收到以下错误:

使用现有的测试数据库作为别名“默认” ...
创建测试数据库时出错:(1064,“您的SQL语法有错误;请查看与您的MariaDB服务器版本相对应的手册,以获取正确的语法,以在'如果不存在test_livedb的情况下使用CREATE DATABASE'; \ n在第2行设置sql_note'”)

我认为这是MariaDB和MySQL之间语法不同的问题。无论如何,可以使keepdb选项与MariaDB一起使用吗?

非常感谢!

2 个答案:

答案 0 :(得分:0)

其价值:此错误在Django 2.0.0中引入,并在Django 2.1.3(https://code.djangoproject.com/ticket/29827)中已修复

答案 1 :(得分:-1)

两件事-签出Factory Boy(用于创建测试数据),我建议也签出Pytest。对于非托管表,我认为您会遇到的问题是(至少以我的经验)django不会在测试环境中创建它们,最终您会遇到问题,因为没有migration文件来创建这些表(因为它们是非托管的)。 Django在创建测试环境时运行migration文件。

使用Pytest,您可以运行一个--nomigrations标志,该标志可以直接从模型中构建测试数据库(从而创建非托管模型所需的表)。

如果将Pytest和Factory Boy结合使用,您应该能够设置测试数据,使其按预期工作,可重复且可测试而没有问题。

我实际上是这样处理的(有点hacky,但它适用于我们复杂的设置):

在我的模特上:

class Meta(object):
    db_table = 'my_custom_table'
    managed = getattr(settings, 'UNDER_TEST', False)

我在UNDER_TEST中创建settings.py变量,如下所示:

# Create global variable that will tell if our application is under test
UNDER_TEST = (len(sys.argv) > 1 and sys.argv[1] == 'test')

这样-当应用程序为UNDER_TEST时,模型被标记为托管(Pytest将创建适当的数据库表)。然后FactoryBoy处理将我所有的测试数据放入该表(在测试的setUp中或其他位置),以便我可以对其进行测试。

这是我的建议-其他人可能会更清楚或更清楚一些。