Django:在运行单元测试之前创建测试表时“无法添加外键约束”

时间:2018-04-20 15:56:58

标签: python mysql django unit-testing foreign-keys

我正在尝试运行我为Django项目编写的单元测试,但测试在数据库创建阶段失败。我有一个单独的数据库“test”,其中一个作为与另一个的外键关系。我运行以下内容:

python3 manage.py test --settings myapp.settings_test

并看到以下输出:

Creating test database for alias 'test'...
Got an error creating the test database: (1007, "Can't create database 'test_test'; database exists")
Type 'yes' if you would like to try deleting the test database 'test_test', or 'no' to cancel: yes
Destroying old test database for alias 'test'...
Traceback (most recent call last):
  File "/usr/local/lib/python3.5/dist-packages/django/db/backends/utils.py", line 85, in _execute
    return self.cursor.execute(sql, params)
  File "/usr/local/lib/python3.5/dist-packages/django/db/backends/mysql/base.py", line 71, in execute
    return self.cursor.execute(query, args)
  File "/usr/local/lib/python3.5/dist-packages/MySQLdb/cursors.py", line 250, in execute
    self.errorhandler(self, exc, value)
  File "/usr/local/lib/python3.5/dist-packages/MySQLdb/connections.py", line 50, in defaulterrorhandler
    raise errorvalue
  File "/usr/local/lib/python3.5/dist-packages/MySQLdb/cursors.py", line 247, in execute
    res = self._query(query)
  File "/usr/local/lib/python3.5/dist-packages/MySQLdb/cursors.py", line 411, in _query
    rowcount = self._do_query(q)
  File "/usr/local/lib/python3.5/dist-packages/MySQLdb/cursors.py", line 374, in _do_query
    db.query(q)
  File "/usr/local/lib/python3.5/dist-packages/MySQLdb/connections.py", line 277, in query
    _mysql.connection.query(self, query)
_mysql_exceptions.IntegrityError: (1215, 'Cannot add foreign key constraint')

我见过许多答案,例如:Django MySQL error when creating tables

这样的答案表明,通常,在添加外键引用的表之前添加具有外键字段的表会导致此错误。但是,我没有找到很多有用的答案,如何在测试场景中解决这个问题。

我尝试过的其他事情:

  • 我试图在Django shell中运行测试,以便我可以使用“django.db.connection”来显示Django正在运行的原始MySQL命令,但我似乎无法弄清楚如何在Django shell中运行测试。

  • 我试图在没有迁移的情况下运行测试(https://pypi.org/project/django-test-without-migrations/),但这似乎没有效果。

  • 在我的测试设置文件中,我添加了MIGRATION_MODULES变量来解决具有外键字段的应用程序“badapp”:

    MIGRATION_MODULES = {     'badapp':没有 }

    但这也没有区别。

我想知道:

1.。)如何通过以错误的顺序添加表来验证此错误是什么?

2.。)运行测试时如何强制以特定顺序添加表?

1 个答案:

答案 0 :(得分:0)

根据您的reddit version of the question,您在数据库选项中设置了DispatchQueue.main.async { tableView.reloadData() } 。删除后会发生什么?什么是你的默认存储引擎(我假设InnoDB但想要检查)?