Юг: не может ALTER TABLE, поскольку он имеет ожидающие события триггера
Я хочу удалить null = True из TextField:
- footer=models.TextField(null=True, blank=True)
+ footer=models.TextField(blank=True, default='')
Я создал миграцию схемы:
manage.py schemamigration fooapp --auto
Так как некоторые столбцы нижнего колонтитула содержат NULL, я получаю эту ошибку, если я запускаю миграцию:
django.db.utils.IntegrityError: column "footer" contains null values
Я добавил это к миграции схемы:
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
Что не так?
Ответы
Ответ 1
Каждая миграция внутри транзакции. В PostgreSQL вы не должны обновлять таблицу, а затем изменять схему таблицы в одной транзакции.
Вам нужно разделить миграцию данных и миграцию схемы. Сначала создайте миграцию данных с помощью этого кода:
for sender in orm['fooapp.EmailSender'].objects.filter(footer=None):
sender.footer=''
sender.save()
Затем создайте миграцию схемы:
manage.py schemamigration fooapp --auto
Теперь у вас две транзакции, и миграция выполняется в два этапа.
Ответ 2
Еще одна причина для этого, возможно, потому, что вы пытаетесь установить столбец в NOT NULL
, когда он уже имеет значения NULL
.
Ответ 3
Удалось только решить эту проблему. Вы также можете использовать db.start_transaction() и db.commit_transaction() в миграции схемы для разделения изменений данных из изменений схемы. Вероятно, это не так чисто, чтобы иметь отдельную миграцию данных, но в моем случае мне понадобилась бы схема, данные, а затем еще одна миграция схемы, поэтому я решил сделать все это сразу.