web-dev-qa-db-fra.com

Django 2.0: sqlite IntegrityError: la contrainte FOREIGN KEY a échoué

Je travaille sur l'ajout de la prise en charge de Django 2.0 à la bibliothèque Django-pagetree . Pendant les tests automatisés, en utilisant une base de données sqlite en mémoire, je reçois un tas d'erreurs comme celle-ci:

  File "/home/nnyby/src/Django-pagetree/pagetree/tests/test_models.py", line 638, in setUp
    'children': [],
  File "/home/nnyby/src/Django-pagetree/pagetree/models.py", line 586, in add_child_section_from_dict

...

  File "/home/nnyby/src/Django-pagetree/venv/lib/python3.5/site-packages/Django/db/backends/base/base.py", line 239, in _commit
    return self.connection.commit()
Django.db.utils.IntegrityError: FOREIGN KEY constraint failed

Ceci est noté dans les notes de version Django 2.0: https://docs.djangoproject.com/en/2.0/releases/2.0/#foreign-key-constraints-are- maintenant activé sur sqlite

D'après cette description, que je ne comprends pas bien, cela ne devrait pas s'appliquer aux bases de données de test qui ne sont pas persistantes, non? Mon db de test sqlite ne serait-il pas créé avec les options appropriées lors de l'utilisation de Django 2.0?

Les paramètres d'application que j'utilise pour les tests sont ici: https://github.com/ccnmtl/Django-pagetree/blob/master/runtests.py

6
nnyby

La documentation dit deux choses:

  1. Si vous avez des contraintes ForeignKey, elles sont désormais appliquées au niveau de la base de données. Assurez-vous donc que vous ne violez pas une contrainte de clé étrangère. C'est la cause la plus probable de votre problème, bien que cela signifie que vous auriez vu ces problèmes avec d'autres bases de données. Recherchez des modèles comme celui-ci dans votre code:

    # in pagetree/models.py, line 810
    @classmethod
    def create_from_dict(cls, d):
        return cls.objects.create()  # what happens to d by the way?
    

    Cela échouera définitivement avec une erreur de contrainte ForeignKey car un PageBlock doit avoir section, vous ne pouvez donc pas appeler create sans d'abord l'assigner.

  2. Si vous contournez la contrainte de clé étrangère en effectuant une transaction atomique (par exemple) pour différer la validation de la clé étrangère, votre clé étrangère doit être INITIALEMENT DIFFÉRÉE. En effet, votre base de données de test devrait déjà avoir cela car il est reconstruit à chaque fois.

6
dirkgroten

Une situation rencontrée un peu différente avec la même erreur. Le problème est que j'utilise le même nom de modèle et le même nom de champ

CODE INCORRECT

class Column(models.Model):
    ...

class ColumnToDepartment(models.Model):
    column = models.ForeignKey(Column, on_delete=models.CASCADE)

SULUTION

class Column(models.Model):
    ...

class ColumnToDepartment(models.Model):
    col = models.ForeignKey(Column, on_delete=models.CASCADE)
1
Yuriy Gyerts
1
Krzysieqq

Je viens d'avoir cette erreur: sqlite3.IntegrityError: FOREIGN KEY constraint failed sur mon Django. Il s'avère que j'ai supprimé le dossier des migrations quelque part le long de la ligne afin qu'il ne prenne pas en compte mes modifications de modèle lorsque j'ai exécuté python manage.py makemigrations. Assurez-vous simplement que vous disposez toujours d'un dossier de migrations avec des migrations.

0
Bennie van Eeden