Python Django:“;无法添加外键约束";在运行单元测试之前创建测试表时
我试图运行为Django项目编写的单元测试,但在数据库创建阶段测试失败。我有一个数据库“test”,其中一个作为外键与另一个关系。我运行以下命令:Python Django:“;无法添加外键约束";在运行单元测试之前创建测试表时,python,mysql,django,unit-testing,foreign-keys,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 databas
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 shell中运行测试,这样我就可以使用“Django.db.connection”来显示Django正在运行的原始MySQL命令,但我似乎不知道如何在Django shell中运行测试
- 我曾尝试在没有迁移()的情况下运行测试,但似乎没有效果
- 在我的测试设置文件中,我添加了MIGRATION_MODULES变量来处理具有外键字段的应用程序“badapp”: 迁移\u模块={ “badapp”:无 } 但这也没什么区别
2.)如何在运行测试时强制按特定顺序添加表?根据您的,您在数据库选项中设置了
'init_命令”:“SET sql_mode='STRICT_TRANS_tables'
。当你移除它时会发生什么?您的默认存储引擎是什么(我假设是InnoDB,但想检查一下)?默认存储引擎确实是InnoDB。当我从数据库定义中删除options参数时,没有任何更改。