【问题标题】:Django Migration: Can't create table errno: 150Django 迁移:无法创建表 errno:150
【发布时间】:2015-09-15 00:29:54
【问题描述】:

我有一个全新的 MariaDB 服务(版本:5.5.41-MariaDB)并为我的 Django (1.8.2) 应用程序创建了一个新数据库。默认情况下,数据库是使用 innoDB 创建的。

我有一个如下所示的模型

class UserProfile(models.Model):
    user = models.OneToOneField(User, unique=True)  # django's default user model

当我运行 python manage.py migrate。我收到以下错误:

  File "/home/vagrant/envs/leo/lib/python2.7/site-packages/MySQLdb/cursors.py", line 205, in execute
    self.errorhandler(self, exc, value)
  File "/home/vagrant/envs/leo/lib/python2.7/site-packages/MySQLdb/connections.py", line 36, in defaulterrorhandler
    raise errorclass, errorvalue
django.db.utils.OperationalError: (1005, "Can't create table 'leo.#sql-bcd_1f' (errno: 150)").

我做错了什么,我该如何解决?

【问题讨论】:

标签: django django-models


【解决方案1】:

当您不制作迁移文件时,也会发生此错误。请务必在实际迁移之前运行 makemigrations

python manage.py makemigrations <app_name>
python manage.py migrate

【讨论】:

    【解决方案2】:

    我在 django 1.8 下遇到了同样的问题,唯一的区别是我使用的是 MySQL 而不是 MariaDB。

    将数据库的编码从 utf8_unicode_ci 更改为 utf_general_ci 为我解决了这个问题。

    【讨论】:

    • 你能解释一下怎么做吗?
    【解决方案3】:

    这个奇怪的 MySQL 错误是 explained here。我不确定您的 Django 应用程序是如何触发它的。

    【讨论】:

    • 我在运行./manage.py migrate 时遇到了同样的问题。我的数据库中有所有 MyISAM 表,但默认引擎设置为 InnoDB。因此,所有新表都将创建为 InnoDB,这会导致 1005 错误。
    【解决方案4】:

    OneToOneField 不需要唯一属性,就像这样:

    class UserProfile(models.Model):
        user = models.OneToOneField(User)
    

    【讨论】:

    • 我试过没有 unique=True 属性但有同样的问题
    • 您的项目或应用中是否还有其他模型?
    • 是的,但我将它们全部注释掉以进行故障排除,没有运气
    【解决方案5】:

    我设法通过降级到 Django 1.7.9 来解决这个问题。降级后立即生效

    【讨论】:

      猜你喜欢
      • 2013-12-30
      • 2014-04-05
      • 2010-12-17
      • 2016-06-08
      • 2012-03-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多