La cause probable de cela est enracinée dans votre modèle ayant des contraintes de vérification via l'option Meta.constraints
. Les contraintes de vérification (dans Postgres) sont implémentées sous forme de déclencheurs qui s'exécutent à la fin d'une transaction. Par défaut, un fichier de migration Django englobe toutes les opérations de migration à partir d'un fichier dans une seule transaction. Cela signifie que d'autres opérations ALTER TABLE
peuvent se produire avant que vos déclencheurs ne se déclenchent, une situation que Postgres ne peut pas gérer.
Pour contourner ce problème, vous pouvez faire comme le suggère une autre réponse:
operations = [
migrations.RemoveField(...). # Effectuez vos opérations de table normales
migrations.RunPython(migration_func),
# Évaluer les contraintes de vérification
migrations.RunSQL('SET CONSTRAINTS ALL IMMEDIATE;'),
migrations.RemoveField(...). # Exécutez le reste de vos opérations de table
]
Exécuter 'SET CONSTRAINTS ALL IMMEDIATE;'
après la migration des données garantit que toutes ces contraintes de vérification qui attendent normalement jusqu'à la fin de la transaction se déclencheront, ce qui signifie qu'il n'y a plus d'événements de déclenchement en attente avant les prochaines déclarations ALTER TABLE
.
FYI - Ce paramètre est efficace uniquement pour le lanceur de migration Django dans cette transaction. Il n'affectera pas les autres sessions de base de données ou les fichiers de migration ultérieurs.
Contrairement à l'autre réponse liée, j'éviterais d'exécuter un migrations.RunSQL('SET CONSTRAINTS ALL DEFERRED;')
supplémentaire, sinon vous pourriez altérer le comportement d'autres déclencheurs dans les étapes ultérieures qui devraient s'exécuter immédiatement (c'est-à-dire des déclencheurs d'application qui suivent l'historique, etc., qui ne sont pas des contraintes de vérification).
Je voulais juste ajouter un peu plus de clarté ici sur exactement pourquoi cela se produit car c'est une question plus ancienne avec de nombreuses réponses différentes.
2 votes
Cette question est similaire : stackoverflow.com/questions/28429933/… et les réponses étaient plus utiles pour moi.
1 votes
J'ai rencontré le même problème avec Postgres v10 (mais pas avec Postgres v.12). Problème résolu, en ajoutant un fichier de migration séparé.