Chcę usunąć null = True z TextField:
- footer=models.TextField(null=True, blank=True)
+ footer=models.TextField(blank=True, default='')
Utworzyłem migrację schematu:
manage.py schemamigration fooapp --auto
Ponieważ niektóre kolumny stopki zawierają NULL
, otrzymuję to, error
jeśli uruchomię migrację:
django.db.utils.IntegrityError: kolumna „footer” zawiera wartości null
Dodałem to do migracji schematu:
for sender in orm['fooapp.EmailSender'].objects.filter(footer=None):
sender.footer=''
sender.save()
Teraz dostaję:
django.db.utils.DatabaseError: cannot ALTER TABLE "fooapp_emailsender" because it has pending trigger events
Co jest nie tak?
python
django
postgresql
django-migrations
guettli
źródło
źródło
Odpowiedzi:
Innym powodem może być to, że próbujesz ustawić kolumnę,
NOT NULL
gdy faktycznie ma jużNULL
wartości.źródło
Każda migracja odbywa się wewnątrz transakcji. W PostgreSQL nie wolno aktualizować tabeli, a następnie zmieniać schematu tabeli w jednej transakcji.
Musisz podzielić migrację danych i migrację schematu. Najpierw utwórz migrację danych za pomocą tego kodu:
Następnie utwórz migrację schematu:
Teraz masz dwie transakcje i migracja w dwóch krokach powinna działać.
źródło
Właśnie napotkałem ten problem. Możesz również użyć db.start_transaction () i db.commit_transaction () w migracji schematu, aby oddzielić zmiany danych od zmian schematu. Pewnie nie na tyle czysta, żeby mieć osobną migrację danych, ale w moim przypadku potrzebowałbym schematu, danych, a potem kolejnej migracji schematu, więc postanowiłem zrobić to wszystko naraz.
źródło
Na operacjach ustawiłem OGRANICZENIA:
źródło
Zmieniasz schemat kolumny. Ta kolumna stopki nie może już zawierać pustej wartości. Najprawdopodobniej w bazie danych są już zapisane puste wartości dla tej kolumny. Django zaktualizuje te puste wiersze w twojej bazie danych z pustych do obecnie domyślnej wartości za pomocą polecenia migrate. Django próbuje zaktualizować wiersze, w których kolumna stopki ma pustą wartość i jednocześnie zmienić schemat (nie jestem pewien).
Problem polega na tym, że nie możesz zmienić tego samego schematu kolumny, dla którego próbujesz zaktualizować wartości w tym samym czasie.
Jednym z rozwiązań byłoby usunięcie pliku migracji aktualizującego schemat. Następnie uruchom skrypt, aby zaktualizować wszystkie te wartości do wartości domyślnych. Następnie ponownie uruchom migrację, aby zaktualizować schemat. W ten sposób aktualizacja jest już wykonana. Migracja Django zmienia tylko schemat.
źródło