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 (3)
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:
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
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:
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 usandopsql
. Algo como esto debería funcionar:heroku pg:psql < mydb.sql
La advertencia aquí es que primero debe vaciar la base de datos existente.
Si esto también falla, deberá exportar desde la misma versión principal de Postgres que desea importar.
Recientemente he enfrentado el mismo problema, esto es lo que funciona para mí:
- Crear nueva base de datos
Usando Django manage.py para volcar los datos de mi base de datos y restaurarlos a la nueva base de datos después de aplicar todas las migraciones.
python manage.py dumpdata --exclude auth.permission --exclude contenttypes --indent 2> db.json
Restaurar la copia de seguridad
python manage.py loaddata db.json