我遇到了尝试使用本地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
答案 0 :(得分:8)
我很确定这是因为您从Postgres 10导出并导入到9.它没有完全失败但是一些模式定义(在这种情况下是自动递增的ID字段)不正确导入。
我可以想到两个选择:
尝试转储原始SQL而不是自定义格式:
PGPASSWORD=mypassword pg_dump --no-acl --no-owner -h localhost -U myuser mydb > mydb.sql
您无法使用pg_restore
加载此内容 - 而是必须使用psql
手动运行查询。这样的事情应该有效:
heroku pg:psql < mydb.sql
这里需要注意的是,您首先需要清空现有数据库。
如果这也失败了,那么您需要从要导入的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)
我最近遇到了同样的问题,这对我有用:
在应用所有迁移后,使用Django manage.py转储我的数据库数据并将其恢复到新数据库。
python manage.py dumpdata-排除auth.permission-排除内容类型--indent 2> db.json
还原备份
python manage.py loaddata db.json