/django.db.utils.IntegrityError: NOT NULL 约束失败/在 python manage.py 迁移应用程序零之后

Posted

技术标签:

【中文标题】/django.db.utils.IntegrityError: NOT NULL 约束失败/在 python manage.py 迁移应用程序零之后【英文标题】:/django.db.utils.IntegrityError: NOT NULL constraint failed/ after python manage.py migrate app zero 【发布时间】:2017-09-30 06:03:38 【问题描述】:

我在生产和本地迁移中遇到了一些麻烦。最后的情况是,在生产中只有初始迁移,而本地有 8 个迁移或其他东西。所以我决定使用

python manage.py migrate app zero 

在生产环境和本地环境中(django 1.8.7)。在生产中它工作但在本地它引发了makemigrationsmigrate 命令之后没有出现的错误。

django.db.utils.IntegrityError: NOT NULL constraint failed: app_userprofile__new.phone_number

经过几次尝试不同的事情,迁移命令后也开始出现错误。

模型本身:

class UserProfile(models.Model):
    user = models.OneToOneField(User)
    phone_number = models.IntegerField(null=True, blank=True, default=None)

【问题讨论】:

【参考方案1】:

检查您的本地数据库。

此错误通常发生在一条或多条记录不满足 NOT NULL 要求时

    UserProfile.objects.filter(phone_number=None)

您可以通过填写找到的对象的 phone_number 字段来解决此问题

或者删除没有填充phone_number的对象

更新

使用database migrations管理数据库更改可以防止这种情况

【讨论】:

是的,删除一些非常旧的记录有助于解决问题。您能否还说一下我在迁移问题上所做的是否正确?或者至少无害? 在我看来,您没有执行错误的程序。建立新约束时,旧数据可能会导致此类错误。 为什么它认为该字段不为空? blank=True 应该解决这个问题,不是吗?我可以在模型定义中说些什么来解决这个问题吗? @sureshvv 在这种情况下(或者当它发生在我身上时)是因为一个最初不是强制性的字段,恰好是在一些更改之后。如果它从一开始就不是 NULL,它将不会通过这个。 数据库迁移也可以防止这种情况

以上是关于/django.db.utils.IntegrityError: NOT NULL 约束失败/在 python manage.py 迁移应用程序零之后的主要内容,如果未能解决你的问题,请参考以下文章