Django-DB-Migrations: не удается изменить таблицу, потому что она имеет ожидающие события триггера
Я хочу удалить null=True из текстового поля:
- footer=models.TextField(null=True, blank=True)
+ footer=models.TextField(blank=True, default='')
Я создал миграцию схемы:
manage.py schemamigration fooapp --auto
так как некоторые столбцы нижнего колонтитула содержат NULL
Я понял это error
если я запускаю миграции:
Джанго.децибел.utils.IntegrityError: столбец "нижний колонтитул" содержит нулевые значения
я добавил Это в миграционную схема:
for sender in orm['fooapp.EmailSender'].objects.filter(footer=None):
sender.footer=''
sender.save()
теперь я понимаю:
django.db.utils.DatabaseError: cannot ALTER TABLE "fooapp_emailsender" because it has pending trigger events
что не так?
3 ответа:
каждая миграция находится внутри транзакции. В PostgreSQL, вы не должны обновлять таблицу, а затем изменить схему таблицы в одной транзакции.
необходимо разделить миграцию данных и миграцию схемы. Сначала создайте миграцию данных с помощью этого кода:
for sender in orm['fooapp.EmailSender'].objects.filter(footer=None): sender.footer='' sender.save()
затем создайте миграцию схемы:
manage.py schemamigration fooapp --auto
теперь у вас есть две операции и миграция в два этапа, что должно работать.
еще одна причина для этого, возможно, потому, что вы пытаетесь установить столбец в
NOT NULL
когда это на самом деле уже естьNULL
значения.
только что ударил эту проблему. Вы также можете использовать db.start_transaction () и db.commit_transaction () в миграции схемы для отделения изменений данных от изменений схемы. Вероятно, не так чисто, чтобы иметь отдельную миграцию данных, но в моем случае мне понадобится схема, данные, а затем еще одна миграция схемы, поэтому я решил сделать все это сразу.