2017-12-10 19 views
13

내가 가지고있는 로컬 포스트 그레스 데이터베이스를 복원 할 때 heroku postgres 데이터 저장소를 사용하는 데 문제가 있습니다. 복원 된 postgres 데이터베이스를 사용하면 Django가 정상적으로 실행됩니다. 그것은 모든 객체를 검색하고 필드, primay key 등을 아무런 문제없이 사용합니다.IntegrityError : 덤프에서 postgres 복원 후 ForeignKey가있는 모든 모델/필드의 "id"열에 null 값

그러나 데이터베이스에 쓰는 경우 모델에 관계없이 동일한 오류가 발생합니다.

psycopg2.IntegrityError: null value in column "id" violates not-null constraint

heroku 데이터베이스를 재설정하고 빈 슬레이트에서 개체를 만들면 문제가 없습니다. 내가 복원 된 데이터베이스에있는 모든 개체를 만들려고하지만, 난 항상 장고 관리자의 기본 모델을 만들려고에서이 null value in column "id" violates not-null constraint


여기 복사/붙여 넣기 스택 트레이스를 얻을. 이 모델 예제는 생성과 관련된 추가 코드가 없기 때문에 선택했습니다. 신호 또는 아무것도.

Django Version: 2.0 Python Version: 3.6.3

Traceback:

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

The above exception (null value in column "id" violates not-null constraint DETAIL: Failing row contains (null, Special Class, special-class).) was the direct cause of the following exception:

File "/app/.heroku/python/lib/python3.6/site-packages/django/core/handlers/exception.py" in inner 35. response = get_response(request)

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

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

File "/app/.heroku/python/lib/python3.6/site-packages/django/contrib/admin/options.py" in wrapper 574. return self.admin_site.admin_view(view)(*args, **kwargs)

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

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

File "/app/.heroku/python/lib/python3.6/site-packages/django/contrib/admin/sites.py" in inner 223. return view(request, *args, **kwargs)

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

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

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

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

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

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

File "/app/.heroku/python/lib/python3.6/site-packages/django/contrib/admin/options.py" in save_model 1026. obj.save()

File "/app/.heroku/python/lib/python3.6/site-packages/django/db/models/base.py" in save 729. force_update=force_update, update_fields=update_fields)

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

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

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

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

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

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

File "/app/.heroku/python/lib/python3.6/site-packages/django/db/backends/utils.py" in execute 100. return super().execute(sql, params)

File "/app/.heroku/python/lib/python3.6/site-packages/django/db/backends/utils.py" in execute 68. return self._execute_with_wrappers(sql, params, many=False, executor=self._execute)

File "/app/.heroku/python/lib/python3.6/site-packages/django/db/backends/utils.py" in _execute_with_wrappers 77. return executor(sql, params, many, context)

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

File "/app/.heroku/python/lib/python3.6/site-packages/django/db/utils.py" in exit 89. raise dj_exc_value.with_traceback(traceback) from exc_value

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

Exception Type: IntegrityError at /admin/fantasy/raceclass/add/ Exception Value: null value in column "id" violates not-null constraint DETAIL: Failing row contains (null, Special Class, 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'] 

는 방법은 다음과 같습니다 나는 (d) 지역 데이터를 영웅에게 되 돌린다 :

나는 로컬 Postgres 데이터베이스를 버리고있다. (V Heroku가 사용하는 명령에

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

AWS에 업로드하고, 포스트 그레스 데이터 저장소에 복원 (버전 9.6.5) : ersion 10.0)를 사용하여 명령

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 포스트 그레스 로컬 버전을 사용하고 있는데 Heroku가 데이터 저장소는 9.6.5

입니다
+0

당신은 오류의 전체 스택 추적 및 오류가 발생하면 (저장하려는 어떤 모델) 실행되는 코드를 게시 할 수 있습니다하십시오 , 그리고 관련된 모델 클래스. 이걸 보면서, 데이터베이스 복원에 문제가있는 것 같지 않지만 데이터베이스에 쓰려고하는 것과 문제가없는 것처럼 보입니다. – solarissmoke

+0

@solarissmoke 스택 추적 및 모델 코드가 추가되었습니다. 문제가 모두에게 일어날 때 찾을 수있는 가장 기본적인 것으로갔습니다. 당신이 도울 수 있기를 바랍니다! – taylor

답변

5

Postgres 10에서 내보내고 9 개로 가져 오기 때문에 이것이 확실하다고 생각됩니다. 전체적으로 실패하지는 않지만 일부 스키마 정의 (이 경우 자동 증가 ID 필드)가 제대로 가져 오지 않습니다. . 나는 두 가지 옵션의

을 생각할 수 있습니다 :이로드

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

당신은 pg_restore을 사용할 수 없습니다 - 대신 당신이 실행해야합니다 :

  1. 대신 사용자 지정 형식의 원시 SQL 덤프 시도 psql을 사용하여 수동으로 쿼리합니다. 이 같은 것이 작동해야합니다 :

    heroku pg:psql < mydb.sql 
    

    여기서주의해야 할 점은 기존 데이터베이스를 비워야한다는 것입니다.

  2. 이 경우에도 실패하면 가져올 동일한 주 버전의 Postgres에서 내 보내야합니다.

3

중요한 오류는 이것이다 :

일이 기다리고 문제입니다

I'm using Version 10.0 Postgres locally and Heroku Datastore is 9.6.5

. 두 버전 모두 동일한 버전을 사용하려고합니다. 최소한 동일한 주요 버전.

특히이 두 가지를 염두에 두는 이유는 표준 열 IDENTITY columns in Postgres 10의 도입으로 직렬 열을 대체 할 수 있기 때문입니다. 당신은 테이블 정의를 공개하지 않았으므로 나는 추측 만 할 수 있습니다. Postgres 10의 IDENTITY 기능은 Postgres 9.6으로 다시 변환되지 않습니다. 오류 메시지의 NULL 값이 잘못되었음을 잘 설명 할 수 있습니다.

관련 :