django - IntegrityError: valor nulo en la columna "id" para todos los modelos/campos con ForeignKey después de la restauración postgres desde el volcado




postgresql heroku (2)

Tengo problemas al intentar usar un almacén de datos de heroku postgres desde una restauración de una base de datos local de postgres que tengo. Usando la base de datos postgres restaurada, Django se ejecuta normalmente. Recupera todos los objetos y utiliza sus campos, primay key's, etc., sin ningún problema.

Pero cuando se trata de escribir en la base de datos, recibo el mismo error en todos los ámbitos, independientemente de los modelos.

psycopg2.IntegrityError: el valor nulo en la columna "id" infringe la restricción de no nulo

Cuando reinicio la base de datos heroku y creo objetos a partir de una pizarra en blanco, no hay problemas. Pero si intento crear cualquier objeto en una base de datos restaurada, siempre obtengo este null value in column "id" violates not-null constraint

Aquí hay un seguimiento de la pila copiada / pegada al intentar crear un modelo básico en Django Admin. Escogí este ejemplo de modelo porque no hay ningún código adicional relacionado con su creación. No hay señales ni nada.

Versión de Django: 2.0 Versión de Python: 3.6.3

Rastrear:

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

La excepción anterior (el valor nulo en la columna "id" infringe la restricción no nula DETALLE: la fila que falla contiene (nulo, clase especial, clase especial).) Fue la causa directa de la siguiente excepción:

Archivo "/app/.heroku/python/lib/python3.6/site-packages/django/core/handlers/exception.py" en 35. respuesta interior = get_response (solicitud)

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

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

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

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

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

Archivo "/app/.heroku/python/lib/python3.6/site-packages/django/contrib/admin/sites.py" en 223. vista de retorno (solicitud, * args, ** kwargs)

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

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

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

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

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

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

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

Archivo "/app/.heroku/python/lib/python3.6/site-packages/django/db/models/base.py" en guardar 729. force_update = force_update, update_fields = update_fields)

Archivo "/app/.heroku/python/lib/python3.6/site-packages/django/db/models/base.py" en save_base 759. updated = self._save_table (raw, cls, force_insert, force_update, using, campos de actualización)

Archivo "/app/.heroku/python/lib/python3.6/site-packages/django/db/models/base.py" en _save_table 842. result = self._do_insert (cls._base_manager, usando, campos, update_pk, crudo)

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

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

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

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

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

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

Archivo "/app/.heroku/python/lib/python3.6/site-packages/django/db/backends/utils.py" en _execute_with_wrappers 77. return executor (sql, params, muchos, contexto)

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

Archivo "/app/.heroku/python/lib/python3.6/site-packages/django/db/utils.py" en la salida 89. elevar dj_exc_value.with_traceback (traceback) desde exc_value

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

Tipo de excepción: IntegrityError en / admin / fantasy / raceclass / add / Exception Valor: el valor nulo en la columna "id" infringe la restricción de no nulo DETALLE: La fila que falla contiene (nulo, clase especial, clase especial).

El modelo del seguimiento de la pila (tenga en cuenta que este error le ocurre a todos los modelos, no solo a este [muy básico]).

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']

Así es como restauro (d) los datos locales a heroku:

Estoy descargando mi base de datos local de Postgres (versión 10.0) usando el comando:

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

Luego, cargue en AWS y restaure en un almacén de datos de Postgres (versión 9.6.5) en Heroku mediante el comando:

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

Estos son directamente de la Documentación Heroku: https://devcenter.heroku.com/articles/heroku-postgres-import-export

Nota al margen: estoy usando la versión 10.0 Postgres localmente y Heroku Datastore es 9.6.5


El error clave es este:

Estoy usando la versión 10.0 Postgres localmente y Heroku Datastore es 9.6.5

Ese es un problema esperando a suceder. Intentaría usar la misma versión en ambos. Al menos la misma versión principal.

Lo que viene a la mente con estos dos en particular es la introducción de las columnas IDENTITY SQL estándar en Postgres 10 , que están destinadas a reemplazar en gran medida las columnas seriales. Usted no reveló definiciones de tablas, así que solo puedo adivinar. La función de IDENTITY en Postgres 10 no se volvería a traducir a Postgres 9.6, lo que podría explicar muy bien los valores NULL que violan los mensajes de error.

Relacionado:


Estoy bastante seguro de que esto se debe a que está exportando desde Postgres 10 e importando a 9. No está fallando del todo, pero parte de la definición del esquema (en este caso, los campos de ID con incremento automático) no se están importando correctamente.

Puedo pensar en dos opciones:

  1. Intente volcar el SQL sin formato en lugar de un formato personalizado:

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

    No puede usar pg_restore para cargar esto; en lugar de eso, debe ejecutar la consulta manualmente usando psql . Algo como esto debería funcionar:

    heroku pg:psql < mydb.sql

    La advertencia aquí es que primero debe vaciar la base de datos existente.

  2. Si esto también falla, deberá exportar desde la misma versión principal de Postgres que desea importar.





django-2.0