Contexte: J'ai restauré la base de données à partir d'une sauvegarde SQL plusieurs fois Exécution d'une base de données PostgreSQL pour une application Django (Django 1.1.1, python2.4, et de psycopg2 Postgres 8.1). Chaque fois que je fais ça, puis essayer d'ajouter une nouvelle ligne, soit shell, admin, ou d'un site frontal, je reçois cette erreur:Django ORM interprète les séquences PostgreSQL?
IntegrityError: duplicate key violates unique constraint "app_model_pkey"
La décharge de données est très bien et est remise à zéro des séquences. Mais si j'essaye d'ajouter de nouveau la ligne, c'est réussi! Donc, je peux juste essayer de brouiller une nouvelle ligne dans chaque table, puis tout semble être copacétique.
Question: Étant donné que (1) la décharge SQL est bon et Postgres est en train de lire dans correctement (par earlier question), et (2) ORM de Django ne semble pas échouer systématiquement obtenir les valeurs suivantes, ce qui se passe dans ce cas précis?
Je voudrais compris pourquoi, mais cela semble être la réponse. Je n'avais qu'un seul groupe d'auth, et la sauvegarde définissait la valeur actuelle de la séquence de cet ID à 1: 'SELECT pg_catalog.setval ('auth_group_id_seq', 1, false);'. Si j'essaie de sélectionner le nextval de cette séquence, c'est également 1. La requête suivante pour nextval envoie la séquence à 2. – bennylope
C'est incorrect; Django récupère en effet les valeurs des séquences PostgreSQL. Si vous activez la consignation de toutes les instructions dans votre base de données, vous verrez que Django émet un certain nombre de commandes 'SELECT CURRVAL ('" app_table_id_seq "');' En fait, si vous regardez le code de 'django.db.models.sql.compiler.SQLInsertCompiler.execute_sql()' et 'django.db.backends.postgresql.operations.DatabaseOperations.last_insert_id()', youll voir que récupère la valeur de la séquence après chaque commande INSERT à moins que 'autocommit = True'. –