Ich möchte null = True aus einem TextField entfernen:
- footer=models.TextField(null=True, blank=True)
+ footer=models.TextField(blank=True, default='')
Ich habe eine Schemamigration erstellt:
manage.py schemamigration fooapp --auto
Da einige Fußzeilenspalten enthalten, NULL
erhalte ich Folgendes, error
wenn ich die Migration ausführe:
django.db.utils.IntegrityError: Spalte "Fußzeile" enthält Nullwerte
Ich habe dies zur Schemamigration hinzugefügt:
for sender in orm['fooapp.EmailSender'].objects.filter(footer=None):
sender.footer=''
sender.save()
Jetzt bekomme ich:
django.db.utils.DatabaseError: cannot ALTER TABLE "fooapp_emailsender" because it has pending trigger events
Was ist falsch?
python
django
postgresql
django-migrations
guettli
quelle
quelle
Antworten:
Ein weiterer Grund dafür ist möglicherweise, dass Sie versuchen, eine Spalte so einzustellen,
NOT NULL
dass sie tatsächlich bereitsNULL
Werte enthält.quelle
Jede Migration erfolgt innerhalb einer Transaktion. In PostgreSQL dürfen Sie die Tabelle nicht aktualisieren und dann das Tabellenschema in einer Transaktion ändern.
Sie müssen die Datenmigration und die Schemamigration aufteilen. Erstellen Sie zunächst die Datenmigration mit folgendem Code:
Erstellen Sie dann die Schemamigration:
Jetzt haben Sie zwei Transaktionen und die Migration in zwei Schritten sollte funktionieren.
quelle
Habe gerade dieses Problem getroffen. Sie können auch db.start_transaction () und db.commit_transaction () in der Schemamigration verwenden, um Datenänderungen von Schemaänderungen zu trennen. Wahrscheinlich nicht so sauber, dass es eine separate Datenmigration gibt, aber in meinem Fall würde ich Schema, Daten und dann eine weitere Schemamigration benötigen, also habe ich beschlossen, alles auf einmal zu tun.
quelle
Bei den Operationen habe ich SET CONSTRAINTS gesetzt:
quelle
Sie ändern das Spaltenschema. Diese Fußzeilenspalte darf keinen leeren Wert mehr enthalten. Für diese Spalte sind höchstwahrscheinlich bereits leere Werte in der Datenbank gespeichert. Django aktualisiert diese leeren Zeilen in Ihrer Datenbank mit dem Befehl migrate von leer auf den jetzt Standardwert. Django versucht, die Zeilen zu aktualisieren, in denen die Fußzeilenspalte einen leeren Wert hat, und das Schema zur gleichen Zeit zu ändern, wie es scheint (ich bin nicht sicher).
Das Problem ist, dass Sie nicht dasselbe Spaltenschema ändern können, für das Sie die Werte gleichzeitig aktualisieren möchten.
Eine Lösung wäre, die Migrationsdatei zu löschen, die das Schema aktualisiert. Führen Sie dann ein Skript aus, um alle diese Werte auf Ihren Standardwert zu aktualisieren. Führen Sie dann die Migration erneut aus, um das Schema zu aktualisieren. Auf diese Weise ist das Update bereits abgeschlossen. Die Django-Migration ändert nur das Schema.
quelle