Юг: не может 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() в миграции схемы для разделения изменений данных из изменений схемы. Вероятно, это не так чисто, чтобы иметь отдельную миграцию данных, но в моем случае мне понадобилась бы схема, данные, а затем еще одна миграция схемы, поэтому я решил сделать все это сразу.