158 votes

south: impossible d'ALTER TABLE car des événements déclencheurs sont en attente

Je veux supprimer null = True d'un TextField:

 -    footer=models.TextField(null=True, blank=True)
+    footer=models.TextField(blank=True, default='')
 

J'ai créé une migration de schéma:

 manage.py schemamigration fooapp --auto
 

Certaines colonnes de pied de page contenant NULL, j’obtiens cette erreur si j’exécute la migration:

 django.db.utils.IntegrityError: column "footer" contains null values
 

J'ai ajouté ceci à la migration du schéma:

     for sender in orm['fooapp.EmailSender'].objects.filter(footer=None):
        sender.footer=''
        sender.save()
 

Maintenant je reçois:

 django.db.utils.DatabaseError: cannot ALTER TABLE "fooapp_emailsender" because it has pending trigger events
 

Qu'est-ce qui ne va pas?

173voto

maazza Points 1092

Une autre raison à cela peut-être parce que vous essayez de définir une colonne sur non nulle alors qu'elle contient déjà des valeurs NULL

167voto

guettli Points 3284

Chaque migration est à l'intérieur d'une transaction. Dans PostgreSQL, vous ne devez pas mettre à jour la table, puis modifier le schéma de la table en une transaction.

Vous devez fractionner la migration des données et la migration du schéma. Commencez par créer la migration de données avec ce code:

  for sender in orm['fooapp.EmailSender'].objects.filter(footer=None):
    sender.footer=''
    sender.save()
 

Ensuite, créez la migration du schéma:

 manage.py schemamigration fooapp --auto
 

Vous avez maintenant deux transactions et la migration en deux étapes devrait fonctionner.

8voto

clime Points 2431

Je viens de frapper ce problème. Vous pouvez également utiliser db.start_transaction () et db.commit_transaction () dans la migration de schéma pour séparer les modifications de données des modifications de schéma. Probablement pas assez propre pour avoir une migration de données séparée, mais dans mon cas, il me faudrait un schéma, des données, puis une autre migration de schéma, alors j'ai décidé de tout faire en même temps.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X