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
Étant donné que certaines colonnes de pied de page contiennent, NULL
j'obtiens ceci error
si j'exécute la migration:
django.db.utils.IntegrityError: la colonne "footer" contient des valeurs nulles
J'ai ajouté ceci à la migration de 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?
python
django
postgresql
django-migrations
guettli
la source
la source
Réponses:
Une autre raison à cela peut-être parce que vous essayez de définir une colonne sur
NOT NULL
alors qu'elle contient déjà desNULL
valeurs.la source
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 seule transaction.
Vous devez séparer la migration des données et la migration du schéma. Créez d'abord la migration de données avec ce code:
Créez ensuite la migration de schéma:
Vous avez maintenant deux transactions et la migration en deux étapes devrait fonctionner.
la source
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, j'aurais besoin d'un schéma, de données, puis d'une autre migration de schéma, alors j'ai décidé de tout faire en même temps.
la source
Aux opérations je mets SET CONSTRAINTS:
la source
Vous modifiez le schéma de colonne. Cette colonne de pied de page ne peut plus contenir de valeur vide. Il y a probablement des valeurs vides déjà stockées dans la base de données pour cette colonne. Django va mettre à jour ces lignes vides dans votre base de données de vide à la valeur maintenant par défaut avec la commande migrate. Django essaie de mettre à jour les lignes où la colonne de pied de page a une valeur vide et de modifier le schéma en même temps qu'il semble (je ne suis pas sûr).
Le problème est que vous ne pouvez pas modifier le même schéma de colonne pour lequel vous essayez de mettre à jour les valeurs en même temps.
Une solution serait de supprimer le fichier de migrations mettant à jour le schéma. Ensuite, exécutez un script pour mettre à jour toutes ces valeurs avec votre valeur par défaut. Ensuite, réexécutez la migration pour mettre à jour le schéma. De cette façon, la mise à jour est déjà effectuée. La migration Django ne fait que modifier le schéma.
la source