IntegrityError:列中的空值" id"从转储

时间:2017-12-10 23:49:31

标签: django postgresql heroku django-migrations django-2.0

我遇到了尝试使用本地postgres数据库恢复的heroku postgres数据存储区的问题。使用恢复的postgres数据库Django正常运行。它检索所有对象并使用它们的字段,主要密钥等,没有任何问题。

但是当涉及到写入数据库时​​,无论模型如何,我都会得到同样的错误。

  

psycopg2.IntegrityError:列中的空值" id"违反非空约束

当我重置heroku数据库并从空白平板创建对象时,没有任何问题。但是如果我尝试在已恢复的数据库上创建任何对象,我总是得到这个null value in column "id" violates not-null constraint

这是尝试在Django Admin中创建基本模型的复制/粘贴堆栈跟踪。我选择了这个模型示例,因为没有与创建它相关的其他代码。没有信号或任何东西。

  

Django版本:2.0 Python版本:3.6.3

     

回溯:

     

文件   " /app/.heroku/python/lib/python3.6/site-packages/django/db/backends/utils.py"   在_execute中     85. return self.cursor.execute(sql,params)

     

上述异常(列&#34中的空值; id"违反非空   约束DETAIL:失败的行包含(null,Special Class,   特级)。 )是以下例外的直接原因:

     

文件   " /app/.heroku/python/lib/python3.6/site-packages/django/core/handlers/exception.py"   在内心     35. response = get_response(request)

     

文件   " /app/.heroku/python/lib/python3.6/site-packages/django/core/handlers/base.py"   在_get_response中     128. response = self.process_exception_by_middleware(e,request)

     

文件   " /app/.heroku/python/lib/python3.6/site-packages/django/core/handlers/base.py"   在_get_response中     126. response = wrapped_callback(request,* callback_args,** callback_kwargs)

     

文件   " /app/.heroku/python/lib/python3.6/site-packages/django/contrib/admin/options.py"   在包装中     574. return self.admin_site.admin_view(view)(* args,** kwargs)

     

文件   " /app/.heroku/python/lib/python3.6/site-packages/django/utils/decorators.py"   在_wrapped_view中     142. response = view_func(request,* args,** kwargs)

     

文件   " /app/.heroku/python/lib/python3.6/site-packages/django/views/decorators/cache.py"   在_wrapped_view_func中     44. response = view_func(request,* args,** kwargs)

     

文件   " /app/.heroku/python/lib/python3.6/site-packages/django/contrib/admin/sites.py"   在内心     223.返回视图(请求,* args,** kwargs)

     

文件   " /app/.heroku/python/lib/python3.6/site-packages/django/contrib/admin/options.py"   在add_view中     1553. return self.changeform_view(request,None,form_url,extra_context)

     

文件   " /app/.heroku/python/lib/python3.6/site-packages/django/utils/decorators.py"   在_wrapper中     62. return bound_func(* args,** kwargs)

     

文件   " /app/.heroku/python/lib/python3.6/site-packages/django/utils/decorators.py"   在_wrapped_view中     142. response = view_func(request,* args,** kwargs)

     

文件   " /app/.heroku/python/lib/python3.6/site-packages/django/utils/decorators.py"   在bound_func中     58. return func。 get (self,type(self))(* args2,** kwargs2)

     

文件   " /app/.heroku/python/lib/python3.6/site-packages/django/contrib/admin/options.py"   在changeform_view中     1450. return self._changeform_view(request,object_id,form_url,extra_context)

     

文件   " /app/.heroku/python/lib/python3.6/site-packages/django/contrib/admin/options.py"   在_changeform_view中     1490. self.save_model(request,new_object,form,not add)

     

文件   " /app/.heroku/python/lib/python3.6/site-packages/django/contrib/admin/options.py"   在save_model中     1026. obj.save()

     

文件   " /app/.heroku/python/lib/python3.6/site-packages/django/db/models/base.py"   在保存     729. force_update = force_update,update_fields = update_fields)

     

文件   " /app/.heroku/python/lib/python3.6/site-packages/django/db/models/base.py"   在save_base中     759. updated = self._save_table(raw,cls,force_insert,force_update,using,update_fields)

     

文件   " /app/.heroku/python/lib/python3.6/site-packages/django/db/models/base.py"   在_save_table中     842. result = self._do_insert(cls._base_manager,using,fields,update_pk,raw)

     

文件   " /app/.heroku/python/lib/python3.6/site-packages/django/db/models/base.py"   在_do_insert中     880. using = using,raw = raw)

     

文件   " /app/.heroku/python/lib/python3.6/site-packages/django/db/models/manager.py"   在manager_method中     82. return getattr(self.get_queryset(),name)(* args,** kwargs)

     

文件   " /app/.heroku/python/lib/python3.6/site-packages/django/db/models/query.py"   在_insert中     1125. return query.get_compiler(using = using).execute_sql(return_id)

     

文件   " /app/.heroku/python/lib/python3.6/site-packages/django/db/models/sql/compiler.py"   在execute_sql中     1280. cursor.execute(sql,params)

     

文件   " /app/.heroku/python/lib/python3.6/site-packages/django/db/backends/utils.py"   执行中     100. return super()。execute(sql,params)

     

文件   " /app/.heroku/python/lib/python3.6/site-packages/django/db/backends/utils.py"   执行中     68. return self._execute_with_wrappers(sql,params,many = False,executor = self._execute)

     

文件   " /app/.heroku/python/lib/python3.6/site-packages/django/db/backends/utils.py"   在_execute_with_wrappers中     77.返回执行者(sql,params,many,context)

     

文件   " /app/.heroku/python/lib/python3.6/site-packages/django/db/backends/utils.py"   在_execute中     85. return self.cursor.execute(sql,params)

     

文件   " /app/.heroku/python/lib/python3.6/site-packages/django/db/utils.py"   在退出     89.从exc_value提出dj_exc_value.with_traceback(traceback)

     

文件   " /app/.heroku/python/lib/python3.6/site-packages/django/db/backends/utils.py"   在_execute中     85. return self.cursor.execute(sql,params)

     

异常类型:/ admin / fantasy / raceclass / add /中的IntegrityError   异常值:列中的空值" id"违反了非空   约束DETAIL:失败的行包含(null,Special Class,   特级)。

来自堆栈跟踪的模型(请记住,每个模型都会发生此错误,而不仅仅是这个[非常基础的]。)

class RaceClass(models.Model):
    title = models.CharField(max_length=140)
    slug = models.SlugField(unique=True)

    def __str__(self):
        return self.title

    class Meta:
        ordering = ['title']

这是我如何将本地数据恢复到heroku:

我使用命令转储我的本地Postgres数据库(版本10.0):

PGPASSWORD=mypassword pg_dump -Fc --no-acl --no-owner -h localhost -U myuser mydb > mydb.dump

然后使用命令上传到AWS,并在Heroku上恢复到Postgres数据存储区(版本9.6.5):

heroku pg:backups:restore 'https://s3.amazonaws.com/me/items/3H0q/mydb.dump' DATABASE_URL

这些都是直接来自Heroku文档:https://devcenter.heroku.com/articles/heroku-postgres-import-export

附注:我在本地使用版本10.0 Postgres,而Heroku数据存储区是9.6.5

3 个答案:

答案 0 :(得分:8)

我很确定这是因为您从Postgres 10导出并导入到9.它没有完全失败但是一些模式定义(在这种情况下是自动递增的ID字段)不正确导入。

我可以想到两个选择:

  1. 尝试转储原始SQL而不是自定义格式:

    PGPASSWORD=mypassword pg_dump --no-acl --no-owner -h localhost -U myuser mydb > mydb.sql
    

    您无法使用pg_restore加载此内容 - 而是必须使用psql手动运行查询。这样的事情应该有效:

    heroku pg:psql < mydb.sql
    

    这里需要注意的是,您首先需要清空现有数据库。

  2. 如果这也失败了,那么您需要从要导入的Postgres的相同主要版本中导出。

答案 1 :(得分:6)

关键错误是:

  

我在本地使用版本10.0 Postgres,Heroku数据存储区是9.6.5

这是一个等待发生的问题。我会尝试在两者上使用相同的版本。至少是相同的主要版本。

这两个特别想到的是标准SQL IDENTITY columns in Postgres 10的引入,它们主要取代串行列。你没有透露表格定义,所以我只能猜测。 Postgres 10中的IDENTITY功能无法转换回Postgres 9.6,这可以很好地解释错误消息中违反的NULL值。

相关:

答案 2 :(得分:0)

我最近遇到了同样的问题,这对我有用:

  1. 创建新数据库
  2. 在应用所有迁移后,使用Django manage.py转储我的数据库数据并将其恢复到新数据库。

    python manage.py dumpdata-排除auth.permission-排除内容类型--indent 2> db.json

  3. 还原备份

    python manage.py loaddata db.json