mysql - Django unittest - 无法创建表

标签 mysql django unit-testing

我正在尝试为我的 Django 应用程序编写简单的测试。但是每次我运行 ./manage.py test 时它都会失败。

Traceback (most recent call last):
File "./manage.py", line 10, in <module>
execute_from_command_line(sys.argv)
File "/home/tyler/projects/django/env/local/lib/python2.7/site-package/django/core/management/__init__.py", line 338, in execute_from_command_line
utility.execute()
File "/home/tyler/projects/django/env/local/lib/python2.7/site-packages/django/core/management/__init__.py", line 330, in execute
self.fetch_command(subcommand).run_from_argv(self.argv)
File "/home/tyler/projects/django/env/local/lib/python2.7/site-packages/django/core/management/commands/test.py", line 30, in run_from_argv
super(Command, self).run_from_argv(argv)
File "/home/tyler/projects/django/env/local/lib/python2.7/site-packages/django/core/management/base.py", line 390, in run_from_argv
self.execute(*args, **cmd_options)
File "/home/tyler/projects/django/env/local/lib/python2.7/site-packages/django/core/management/commands/test.py", line 74, in execute
super(Command, self).execute(*args, **options)
File "/home/tyler/projects/django/env/local/lib/python2.7/site-packages/django/core/management/base.py", line 441, in execute
output = self.handle(*args, **options)
File "/home/tyler/projects/django/env/local/lib/python2.7/site-packages/django/core/management/commands/test.py", line 90, in handle
failures = test_runner.run_tests(test_labels)
File "/home/tyler/projects/django/env/local/lib/python2.7/site-packages/django/test/runner.py", line 210, in run_tests
old_config = self.setup_databases()
File "/home/tyler/projects/django/env/local/lib/python2.7/site-packages/django/test/runner.py", line 166, in setup_databases
**kwargs
File "/home/tyler/projects/django/env/local/lib/python2.7/site-packages/django/test/runner.py", line 370, in setup_databases
serialize=connection.settings_dict.get("TEST", {}).get("SERIALIZE", True),
File "/home/tyler/projects/django/env/local/lib/python2.7/site-packages/django/db/backends/base/creation.py", line 368, in create_test_db
test_flush=not keepdb,
File "/home/tyler/projects/django/env/local/lib/python2.7/site-packages/django/core/management/__init__.py", line 120, in call_command
return command.execute(*args, **defaults)
File "/home/tyler/projects/django/env/local/lib/python2.7/site-packages/django/core/management/base.py", line 441, in execute
output = self.handle(*args, **options)
File "/home/tyler/projects/django/env/local/lib/python2.7/site-packages/django/core/management/commands/migrate.py", line 179, in handle
created_models = self.sync_apps(connection, executor.loader.unmigrated_apps)
File "/home/tyler/projects/django/env/local/lib/python2.7/site-packages/django/core/management/commands/migrate.py", line 317, in sync_apps
cursor.execute(statement)
File "/home/tyler/projects/django/env/local/lib/python2.7/site-packages/django/db/backends/utils.py", line 64, in execute
return self.cursor.execute(sql, params)
File "/home/tyler/projects/django/env/local/lib/python2.7/site-packages/django/db/utils.py", line 97, in __exit__
six.reraise(dj_exc_type, dj_exc_value, traceback)
File "/home/tyler/projects/django/env/local/lib/python2.7/site-packages/django/db/backends/utils.py", line 62, in execute
return self.cursor.execute(sql)
File "/home/tyler/projects/django/env/local/lib/python2.7/site-packages/django/db/backends/mysql/base.py", line 124, in execute
return self.cursor.execute(query, args)
File "/home/tyler/projects/django/env/local/lib/python2.7/site-packages/MySQLdb/cursors.py", line 205, in execute
self.errorhandler(self, exc, value)
File "/home/tyler/projects/django/env/local/lib/python2.7/site-packages/MySQLdb/connections.py", line 36, in defaulterrorhandler
raise errorclass, errorvalue
django.db.utils.OperationalError: (1005, "Can't create table 'test_products.#sql-4b8_e9' (errno: 150)")

我以为问题出在MySQL引擎上,但我在MySQL workbench中检查它是InnoDb引擎。可能有人有同样的问题。

最佳答案

在我从 Django 1.5 移植到 Django 1.8 的 Django 应用程序上运行 manage.py test 时,我遇到了完全相同的问题。

./manage.py test
Creating test database for alias 'default'...
Traceback (most recent call last):
  File "./manage.py", line 10, in <module>

...

  File "/usr/local/lib/python2.7/dist-packages/MySQLdb/connections.py", line 36, in defaulterrorhandler
    raise errorclass, errorvalue
django.db.utils.OperationalError: (1005, "Can't create table 'test_xxxx.#sql-6c1_6c' (errno: 150)")

正如 Sergii V. 指出的那样,解决方案与迁移有关。在我的例子中,根本没有迁移文件(Django 1.5 中不存在该功能)。

所以解决方案正在运行

./manage.py makemigrations <appname>

在那之后,测试工作正常:

./manage.py test
Creating test database for alias 'default'...
.
----------------------------------------------------------------------
Ran 1 test in 0.014s

OK
Destroying test database for alias 'default'...

关于mysql - Django unittest - 无法创建表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30828480/

相关文章:

java - 相互比较两个 REST 服务

java - 封装良好的类的TestNG测试类

php - 使用 PHP 和 AJAX,两个客户端可以在没有 MySQL 的情况下相互交换数据吗?

c# - 使用 MySQL 后端开发 C# 项目的最佳方法是什么?

php - 如何循环重复月份?

javascript - 使用 Javascript 或 Jquery 将参数传递给 url

python - 如何轻松地将 GQLQuery 的日期字段格式化为另一个时区?

javascript - 如何在 Django 中点击 'ok' 后触发 Javascript 警报并重定向页面?

unit-testing - VS-Code 错误的单元测试类型(Mocha&Chai 而不是 Jasmine)

php - 如何在 SQL 中选择 php date() 格式