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 72

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