我有一个包含很多非托管表的数据库,我正在将它们用于Django应用程序。为了进行测试,我想使用--keepdb选项,这样我就不必每次都重新填充这些表。我正在为数据库使用MariaDB。如果我不使用keepdb选项,则一切正常,测试数据库将被正确创建和销毁。
但是当我尝试运行测试以保留数据库时:
$ python manage.py test --keepdb
我收到以下错误:
使用现有的测试数据库作为别名“默认” ...
创建测试数据库时出错:(1064,“您的SQL语法有错误;请查看与您的MariaDB服务器版本相对应的手册,以获取正确的语法,以在'如果不存在test_livedb
的情况下使用CREATE DATABASE'; \ n在第2行设置sql_note'”)
我认为这是MariaDB和MySQL之间语法不同的问题。无论如何,可以使keepdb选项与MariaDB一起使用吗?
非常感谢!
答案 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
中或其他位置),以便我可以对其进行测试。
这是我的建议-其他人可能会更清楚或更清楚一些。