我在尝试从我拥有的本地 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
追溯:
_execute 85 中的文件“/app/.heroku/python/lib/python3.6/site-packages/django/db/backends/utils.py”。返回 self.cursor.execute(sql, params)
上述异常(“id”列中的空值违反非空约束细节:失败行包含(空,特殊类,特殊类)。)是以下异常的直接原因:
内部 35 中的文件“/app/.heroku/python/lib/python3.6/site-packages/django/core/handlers/exception.py”。 response = get_response(request)
_get_response 128 中的文件“/app/.heroku/python/lib/python3.6/site-packages/django/core/handlers/base.py”。response = self.process_exception_by_middleware(e, request)
_get_response 126 中的文件“/app/.heroku/python/lib/python3.6/site-packages/django/core/handlers/base.py”。 response = Wrapped_callback(request, *callback_args, **callback_kwargs)
包装器 574 中的文件“/app/.heroku/python/lib/python3.6/site-packages/django/contrib/admin/options.py”。返回 self.admin_site.admin_view(view)(*args, **kwargs )
_wrapped_view 142 中的文件“/app/.heroku/python/lib/python3.6/site-packages/django/utils/decorators.py”。 response = view_func(request, *args, **kwargs)
_wrapped_view_func 44 中的文件“/app/.heroku/python/lib/python3.6/site-packages/django/views/decorators/cache.py”。 response = view_func(request, *args, **kwargs)
内部 223 中的文件“/app/.heroku/python/lib/python3.6/site-packages/django/contrib/admin/sites.py”。返回视图(请求,*args,**kwargs)
add_view 1553 中的文件“/app/.heroku/python/lib/python3.6/site-packages/django/contrib/admin/options.py”。 return self.changeform_view(request, None, form_url, extra_context)
_wrapper 62 中的文件“/app/.heroku/python/lib/python3.6/site-packages/django/utils/decorators.py”。 return bound_func(*args, **kwargs)
_wrapped_view 142 中的文件“/app/.heroku/python/lib/python3.6/site-packages/django/utils/decorators.py”。 response = view_func(request, *args, **kwargs)
bound_func 58中的文件“/app/.heroku/python/lib/python3.6/site-packages/django/utils/decorators.py”。返回func。获取(自我,类型(自我))(*args2,**kwargs2)
changeform_view 1450 中的文件“/app/.heroku/python/lib/python3.6/site-packages/django/contrib/admin/options.py”。返回 self._changeform_view(request, object_id, form_url, extra_context)
_changeform_view 1490 中的文件“/app/.heroku/python/lib/python3.6/site-packages/django/contrib/admin/options.py”。self.save_model(request, new_object, form, not add)
save_model 1026.obj.save() 中的文件“/app/.heroku/python/lib/python3.6/site-packages/django/contrib/admin/options.py”
保存 729 中的文件“/app/.heroku/python/lib/python3.6/site-packages/django/db/models/base.py”。force_update=force_update,update_fields=update_fields)
save_base 759 中的文件“/app/.heroku/python/lib/python3.6/site-packages/django/db/models/base.py”。updated = self._save_table(raw, cls, force_insert, force_update, using,更新字段)
_save_table 842 中的文件“/app/.heroku/python/lib/python3.6/site-packages/django/db/models/base.py”。结果 = self._do_insert(cls._base_manager, using, fields, update_pk,生的)
_do_insert 880 中的文件“/app/.heroku/python/lib/python3.6/site-packages/django/db/models/base.py”。使用=使用,原始=原始)
manager_method 82 中的文件“/app/.heroku/python/lib/python3.6/site-packages/django/db/models/manager.py”。 return getattr(self.get_queryset(), name)(*args, * *夸格斯)
_insert 1125 中的文件“/app/.heroku/python/lib/python3.6/site-packages/django/db/models/query.py”。返回 query.get_compiler(using=using).execute_sql(return_id)
execute_sql 1280 中的文件“/app/.heroku/python/lib/python3.6/site-packages/django/db/models/sql/compiler.py”。 cursor.execute(sql, params)
执行 100 中的文件“/app/.heroku/python/lib/python3.6/site-packages/django/db/backends/utils.py”。返回 super().execute(sql, params)
执行 68 中的文件“/app/.heroku/python/lib/python3.6/site-packages/django/db/backends/utils.py”。 return self._execute_with_wrappers(sql, params, many=False, executor=self 。_执行)
_execute_with_wrappers 中的文件“/app/.heroku/python/lib/python3.6/site-packages/django/db/backends/utils.py” 77. return executor(sql, params, many, context)
_execute 85 中的文件“/app/.heroku/python/lib/python3.6/site-packages/django/db/backends/utils.py”。返回 self.cursor.execute(sql, params)
退出89中的文件“/app/.heroku/python/lib/python3.6/site-packages/django/db/utils.py”。 从 exc_value 提高 dj_exc_value.with_traceback(traceback)
_execute 85 中的文件“/app/.heroku/python/lib/python3.6/site-packages/django/db/backends/utils.py”。返回 self.cursor.execute(sql, params)
异常类型:/admin/fantasy/raceclass/add/ 处的 IntegrityError 异常值:“id”列中的空值违反非空约束细节:失败行包含(空、特殊类、特殊类)。
来自堆栈跟踪的模型(请记住,每个模型都会发生此错误,而不仅仅是这个 [非常基本的] 模型。)
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