【问题标题】:Django makemigrations works, migrate fails with "django.db.utils.IntegrityError: NOT NULL constraint failed"Django makemigrations 工作,迁移失败,“django.db.utils.IntegrityError: NOT NULL constraint failed”
【发布时间】:2014-09-26 08:38:10
【问题描述】:

我被困住了。 Django 1.7,SQLite3。

我已更改模型以添加thumbnail 列,如this tutorial。是这样的:

from django.db import models

class Article(models.Model):
    title = models.CharField(max_length=200)
    body = models.TextField()
    pub_date = models.DateTimeField('date published')
    likes = models.IntegerField(default=0)

    def __str__(self):
        return  self.title

现在是这样的:

from django.db import models
from time import time         

def get_upload_file_name(instance, filename):
    return  "uploaded_files/%s_%s" % (str(time()).replace(".", "_"), filename)

class Article(models.Model):
    title = models.CharField(max_length=200)
    body = models.TextField()
    pub_date = models.DateTimeField('date published')
    likes = models.IntegerField(default=0) 
    thumbnail = models.FileField(upload_to=get_upload_file_name, null=True)

    def __str__(self):
        return  self.title

我用

将所有数据备份到一个 json 文本文件
python manage.py dumpdata article --indent=4 > article.json

然后执行

python manage.py makemigrations

这很有效。但是

python manage.py migrate

失败

django.db.utils.IntegrityError: NOT NULL constraint failed: article_article__new.thumbnail

现在,即使将null=True 添加到models.pythumbnail 行,运行makemigrations 也会成功,而migrate 会以同样的方式失败。

我该怎么办?

【问题讨论】:

    标签: python django sqlite


    【解决方案1】:

    只是添加另一个解决方案。

    就我而言,我创建BASE_DIR 的方式不正确,因此DATABASES NAME 也是错误的。所以它正在其他地方创建数据库。当我运行迁移时,它可能会抛出这个错误,因为那里存在一些旧数据库。所以解决方法是更正DATABASE 路径。

    【讨论】:

      【解决方案2】:

      我的应用名称(使用python manage.py startapp 创建)称为articles。这是新的articles\migrations 文件夹,在多次收到空约束错误后:

      __init__.py
      0001_initial.py
      0002_auto_20140803_1540.py
      0003_auto_20140803_1542.py
      0004_auto_20140803_1450.py
      0005_auto_20140803_1552.py
      __pycache__
         __init__.cpython-34.pyc
         0001_initial.cpython-34.pyc
         0002_auto_20140803_1540.cpython-34.pyc
         0003_auto_20140803_1542.cpython-34.pyc
         0004_auto_20140803_1450.cpython-34.pyc
         0005_auto_20140803_1552.cpython-34.pyc
      

      我删除了两个目录中的所有 000* 文件,但 0001 除外。

      然后我跑了

      python manage.py makemigrations
      

      python manage.py migrate
      

      成功了。

      感谢irc.freenode.net/django

      【讨论】:

      • 我不明白这是如何回答这个问题的。
      • 这不是一个答案,它是“然后不要这样做并重新回滚”
      猜你喜欢
      • 1970-01-01
      • 2022-12-04
      • 2015-04-24
      • 1970-01-01
      • 1970-01-01
      • 2017-04-19
      • 1970-01-01
      • 2016-04-07
      • 1970-01-01
      相关资源
      最近更新 更多