Подтвердить что ты не робот

IntegrityError: значение null в столбце "id" для всех моделей/полей с ForeignKey после восстановления postgres из дампа

У меня возникают проблемы с попыткой использовать хранилище postgres heroku из восстановления локальной базы данных postgres, которую у меня есть. Используя восстановленную базу данных postgres, Django работает как обычно. Он извлекает все объекты и использует их поля, ключ и т.д. Без каких-либо проблем.

Но когда дело доходит до записи в базу данных, я получаю одну и ту же ошибку по всей доске, независимо от модели (ов).

psycopg2.IntegrityError: значение null в столбце "id" нарушает непустое ограничение

Когда я reset база данных heroku и создает объекты из чистого листа, проблем нет. Но если я попытаюсь создать любой объект в восстановленной базе данных, я всегда получаю этот null value in column "id" violates not-null constraint


Здесь копия/вставленная трассировка стека из попытки создать базовую модель в Django Admin. Я выбрал этот пример модели, потому что нет никакого дополнительного кода, связанного с его созданием. Нет сигналов или чего-либо еще.

Django Версия: 2.0 Python Версия: 3.6.3

Traceback:

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

Вышеописанное исключение (значение null в столбце "id" нарушает не-null Ограничение ДЕТАЛЬ: Неудачная строка содержит (null, Special Class, специальный класс). ) была прямой причиной следующего исключения:

Файл "/app/.heroku/python/lib/python3.6/site-packages/django/core/handlers/exception.py" во внутреннем   35. response = get_response (запрос)

Файл "/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 (запрос, * 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 (запрос, * args, ** kwargs)

Файл "/app/.heroku/python/lib/python3.6/site-packages/django/views/decorators/cache.py" в _wrapped_view_func   44. response = view_func (запрос, * args, ** kwargs)

Файл "/app/.heroku/python/lib/python3.6/site-packages/django/contrib/admin/sites.py" во внутреннем   223. return view (request, * args, ** kwargs)

Файл "/app/.heroku/python/lib/python3.6/site-packages/django/contrib/admin/options.py" в add_view   1553. return self.changeform_view (запрос, 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 (запрос, * 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, используя поля, 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" in _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. return executor (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. Поднять dj_exc_value.with_traceback (traceback) из exc_value

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

Тип исключения: IntegrityError at/admin/fantasy/raceclass/add/ Значение исключения: значение null в столбце "id" нарушает не-null Ограничение ДЕТАЛЬ: Неудачная строка содержит (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']

Здесь, как я восстанавливаю (d) локальные данные для heroku:

Я сбрасываю свою локальную базу данных Postgres (версия 10.0) с помощью команды:

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

Затем загрузка в AWS и восстановление в Postgres Datastore (версия 9.6.5) на Heroku с помощью команды:

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


Боковое примечание: я использую Postgres версии 10.0 локально, а хранилище Heroku Datastore - 9.6.5

4b9b3361

Ответ 1

Я уверен, что это происходит из-за того, что вы экспортируете 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, которую вы хотите импортировать.

Ответ 2

Ключевой ошибкой является следующее:

Я использую Postgres версии 10.0 локально, а Heroku Datastore - 9.6.5

Это проблема, ожидающая случиться. Я бы попытался использовать ту же версию для обоих. По крайней мере, та же самая основная версия.

То, что приходит на ум с этими двумя, в частности, - это введение стандартных столбцов IDENTITY в Postgres 10, которые предназначены для значительной замены последовательных столбцов. Вы не раскрывали определения таблиц, поэтому я могу только догадываться. Функция IDENTITY в Postgres 10 не переводится обратно в Postgres 9.6, что вполне может объяснить нарушения значений NULL в ваших сообщениях об ошибках.

по теме: