Django makemigrations成功,但迁移失败,提示"django.db.utils.IntegrityError: NOT NULL约束失败

7 投票
2 回答
19207 浏览
提问于 2025-04-18 15:51

我遇到麻烦了。使用的是Django 1.7和SQLite3。

我在模型中添加了一个叫做 thumbnail 的列,参考了这个教程。之前是这样的:

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

现在,即使我在 models.py 中的 thumbnail 行添加了 null=True,运行 makemigrations 是成功的,但 migrate 还是同样失败。

我该怎么办?

2 个回答

0

我再补充一个解决方案。

在我的情况下,我创建 BASE_DIR 的方式不对,所以 DATABASES NAME 也出错了。这样一来,数据库就被创建在了其他地方。当我运行迁移时,就出现了错误,可能是因为那里已经存在一个旧的数据库。所以解决办法就是把 DATABASE 的路径修正过来。

14

我创建的应用名字是 articles,是用 python manage.py startapp 命令生成的。这里是新的 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 了。

撰写回答