Я хочу удалить null = True из TextField:
- footer=models.TextField(null=True, blank=True)
+ footer=models.TextField(blank=True, default='')
Я создал миграцию схемы:
manage.py schemamigration fooapp --auto
Поскольку некоторые столбцы нижнего колонтитула содержат, NULL
я получаю это, error
если запускаю миграцию:
django.db.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
Что случилось?
python
django
postgresql
django-migrations
guettli
источник
источник
Ответы:
Другая причина для этого может быть связана с тем, что вы пытаетесь установить столбец,
NOT NULL
когда он на самом деле уже имеетNULL
значения.источник
Каждая миграция происходит внутри транзакции. В PostgreSQL вы не должны обновлять таблицу, а затем изменять схему таблицы за одну транзакцию.
Вам нужно разделить миграцию данных и миграцию схемы. Сначала создайте миграцию данных с помощью этого кода:
Затем создайте миграцию схемы:
Теперь у вас есть две транзакции, и миграция в два этапа должна работать.
источник
Только что ударил эту проблему. Вы также можете использовать db.start_transaction () и db.commit_transaction () при миграции схемы, чтобы отделить изменения данных от изменений схемы. Наверное, не так чисто, чтобы иметь отдельную миграцию данных, но в моем случае мне понадобятся схема, данные, а затем еще одна миграция схемы, поэтому я решил сделать все это сразу.
источник
На свои операции ставлю УСТАНОВКИ:
источник
Вы изменяете схему столбца. Столбец нижнего колонтитула больше не может содержать пустое значение. Скорее всего, в БД для этого столбца уже хранятся пустые значения. Django собирается обновить эти пустые строки в вашей БД с пустых до значения по умолчанию с помощью команды migrate. Django пытается обновить строки, в которых столбец нижнего колонтитула имеет пустое значение, и одновременно изменить схему (я не уверен).
Проблема в том, что вы не можете изменить ту же схему столбца, для которой вы пытаетесь обновить значения одновременно.
Одним из решений может быть удаление файла миграции, обновляющего схему. Затем запустите сценарий, чтобы обновить все эти значения до значения по умолчанию. Затем повторно запустите миграцию, чтобы обновить схему. Таким образом, обновление уже выполнено. Миграция Django только меняет схему.
источник