django:在运行单元测试之前创建测试表时:“cannotaddforeign key constraint”

ecfsfe2w  于 2021-06-21  发布在  Mysql
关注(0)|答案(1)|浏览(503)

我正在尝试运行为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在创建表时出错。
这样的回答表明,通常情况下,此错误是由于在添加外键引用的表之前添加了具有外键字段的表而导致的。然而,对于如何在测试场景中解决这个问题,我还没有找到很多有用的答案。
我尝试过的其他事情:
我试着在django shell中运行测试,这样我就可以使用“django.db.connection”来显示原始mysql命令django正在运行,但是我似乎不知道如何在django shell中运行测试。
我试过在没有迁移的情况下运行测试(https://pypi.org/project/django-test-without-migrations/)但这似乎没有效果。
在我的测试设置文件中,我添加了migration\u modules变量来处理具有外键字段的应用程序“badapp”:
迁移\u模块={badapp':无}
但这也没什么区别。
我想知道:
1.)如何验证此错误是由于按不正确的顺序添加表引起的?
2.)运行测试时,如何强制按特定顺序添加表?

olqngx59

olqngx591#

根据你的reddit版本的问题,你有 'init_command': "SET sql_mode='STRICT_TRANS_TABLES'" 在数据库选项中设置。当你把它去掉的时候会发生什么?您的默认存储引擎是什么(我假设innodb,但想检查一下)?

相关问题