web-dev-qa-db-fra.com

IntegrityError: valeur nulle dans la colonne "id" pour tous les modèles / champs avec ForeignKey après la restauration postgres à partir du vidage

Je rencontre des problèmes en essayant d'utiliser une banque de données Heroku Postgres à partir d'une restauration d'une base de données Postgres locale que j'ai. L'utilisation de la base de données postgres restaurée Django s'exécute normalement. Il récupère tous les objets et utilise leurs champs, les clés Primay, etc. sans aucun problème.

Mais quand il s'agit d'écrire dans la base de données, j'obtiens la même erreur dans tous les domaines, quel que soit le ou les modèles.

psycopg2.IntegrityError: la valeur nulle dans la colonne "id" viole la contrainte non nulle

Lorsque je réinitialise la base de données Heroku et crée des objets à partir d'une ardoise vierge, il n'y a aucun problème. Mais si j'essaie de créer un objet sur une base de données restaurée, j'obtiens toujours ce null value in column "id" violates not-null constraint


Voici une trace de pile copiée/collée d'essayer de créer un modèle de base dans Django Admin. J'ai choisi cet exemple de modèle car il n'y a pas de code supplémentaire lié à sa création. Aucun signal ou quoi que ce soit.

Version Django: 2.0 Python Version: 3.6.3

Traceback:

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

L'exception ci-dessus (la valeur nulle dans la colonne "id" viole la contrainte non nulle DÉTAIL: La ligne contenant contient (null, classe spéciale, classe spéciale).) Était la cause directe de l'exception suivante:

Fichier "/app/.heroku/python/lib/python3.6/site-packages/Django/core/handlers/exception.py" dans l'interne 35. response = get_response (request)

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

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

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

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

Fichier "/app/.heroku/python/lib/python3.6/site-packages/Django/views/decorators/cache.py" dans _wrapped_view_func 44. response = view_func (demande, * args, ** kwargs)

Fichier "/app/.heroku/python/lib/python3.6/site-packages/Django/contrib/admin/sites.py" dans la vue interne 223. return view (request, * args, ** kwargs)

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

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

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

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

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

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

Fichier "/app/.heroku/python/lib/python3.6/site-packages/Django/contrib/admin/options.py" dans save_model 1026. obj.save ()

Fichier "/app/.heroku/python/lib/python3.6/site-packages/Django/db/models/base.py" dans la sauvegarde 729. force_update = force_update, update_fields = update_fields)

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

Fichier "/app/.heroku/python/lib/python3.6/site-packages/Django/db/models/base.py" dans _save_table 842. resultat = self._do_insert (cls._base_manager, utilisation, champs, update_pk, brut)

Fichier "/app/.heroku/python/lib/python3.6/site-packages/Django/db/models/base.py" dans _do_insert 880. using = using, raw = raw)

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

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

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

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

Fichier "/app/.heroku/python/lib/python3.6/site-packages/Django/db/backends/utils.py" en exécution 68. return self._execute_with_wrappers (sql, params, many = False, executor = self ._exécuter)

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

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

Fichier "/app/.heroku/python/lib/python3.6/site-packages/Django/db/utils.py" dans exit 89. augmenter dj_exc_value.with_traceback (traceback) à partir d'exc_value

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

Type d'exception: IntegrityError dans/admin/fantasy/raceclass/add/Exception Valeur: la valeur nulle dans la colonne "id" viole la contrainte non nulle DÉTAIL: La ligne défaillante contient (null, classe spéciale, classe spéciale).


Le modèle à partir de la trace de la pile (gardez à l'esprit que cette erreur arrive à chaque modèle, pas seulement à celui-ci [très basique].)

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

Voici comment restaurer (d) les données locales sur heroku:

Je vide ma base de données Postgres locale (version 10.0) à l'aide de la commande:

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

Ensuite, téléchargez sur AWS et restaurez dans un magasin de données Postgres (version 9.6.5) sur Heroku à l'aide de la commande:

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

Ce sont tous deux directement de la documentation Heroku: https://devcenter.heroku.com/articles/heroku-postgres-import-export


Note latérale: j'utilise la version 10.0 Postgres localement et Heroku Datastore est 9.6.5

20
taylor

Je suis assez sûr que cela est dû au fait que vous exportez à partir de Postgres 10 et que vous importez dans 9. Cela n'échoue pas complètement, mais certaines des définitions de schéma (dans ce cas, les champs ID auto-incrémentés) ne sont pas correctement importées.

Je peux penser à deux options:

  1. Essayez de vider le SQL brut au lieu d'un format personnalisé:

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

    Vous ne pouvez pas utiliser pg_restore pour charger ceci - à la place, vous devez exécuter la requête manuellement en utilisant psql. Quelque chose comme ça devrait fonctionner:

    heroku pg:psql < mydb.sql
    

    La mise en garde ici est que vous devez d'abord vider la base de données existante.

  2. Si cela échoue également, vous devez exporter à partir de la même version principale de Postgres dans laquelle vous souhaitez importer.

13
solarissmoke

L'erreur clé est la suivante:

J'utilise la version 10.0 Postgres localement et Heroku Datastore est 9.6.5

C'est un problème qui attend de se produire. J'essaierais d'utiliser la même version sur les deux. Au moins la même version majeure.

Ce qui vient à l'esprit avec ces deux en particulier, c'est l'introduction de colonnes standard-SQL IDENTITY dans Postgres 1 =, qui sont destinés à remplacer largement les colonnes série. Vous n'avez pas divulgué les définitions des tableaux, donc je ne peux que deviner. La fonction IDENTITY de Postgres 10 ne se traduirait pas en Postgres 9.6, ce qui pourrait très bien expliquer les valeurs NULL violées dans vos messages d'erreur.

En relation:

6
Erwin Brandstetter

J'ai récemment rencontré le même problème, voici ce qui fonctionne pour moi:

  1. Créer une nouvelle base de données
  2. Utilisation de Django manage.py pour vider les données de ma base de données et les restaurer dans la nouvelle base de données après avoir appliqué toutes les migrations.

    python manage.py dumpdata --exclude auth.permission --exclude contenttypes --indent 2> db.json

  3. Restaurer la sauvegarde

    python manage.py loaddata db.json

0
salafi