标签:
PostgreSQL
django
python
数据库

对数据库手动修改后,出现出错 django.db.utils.IntegrityError: null value in column "id" violates not-null constraint

提问于:1 个月前 ( )最后更新于:1 个月前 (2020-11-01 17:44:35)提问人:豆瓣123455


python: 3.8
django:3.1
数据库: postgresql 10

数据库表结构被我手动修改过很多次, 今天出现了故障,无法注册用户

提示 django.db.utils.IntegrityError: null value in column "id" violates not-null constraint

尝试重启,更换django版本,依然无法解决

1个回答

豆瓣123455
豆瓣123455

找到原因了

就是因为我手动乱改数据库,导致数据库里的索引,自增计数器乱了

因为我对数据库不太懂, 经过搜索,最好的方案就是把数据库里的数据库导出来, 然后重新填到一个新数据库了


我的解决 步骤:

1、 导出数据

执行 python manage.py dumpdata  --indent 2 > db.json

你可以根据需要,使用--exclude排除不要的模型, 如 python manage.py dumpdata --exclude auth --exclude contenttypes  --indent 2 > db.json
但是在我实际测试中,这样出错概率太大了, 因为你不永远不知道你排除的model是否被其他model给依赖了, 所以我是全量导出

2、新建一个数据库,并在django settings.py里修改配置,把数据库名字修改成新的

DATABASES = {
    'default': {
         … …
        'NAME': “新数据库名字”,
         … …
    }
}
3、执行 python manage.py migrate把表结构同步到新数据库
4、 【最重要的一步】, 进入新数据库,把任何有记录的表,全部清空【如auth_permission、django_content_type、django_migrations】

为什么要做这一步呢? 因为我们从旧数据库导出的数据里也有这几个表,如果直接导入新表,会和新表里的id对不上,就会出现各种错误, 我在这一步卡了一会儿,也就浪费了几个小时吧

5、 导入之前的旧数据到新数据库里

执行 python manage.py loaddata db.json

6、 然后开始等待吧, 根据你的数据量,要很久时间的,耐心点
2020-11-02 01:34:47