Нарушение миграции данных в производстве при использовании bulk_update
Мое приложение развернуто на платформе Digital Ocean's App Platform for Django. Базой данных является PostgreSQL.
Следующая миграция данных была выполнена правильно в моей локальной среде. В производственной среде она начинается, но не заканчивается, поэтому развертывание автоматически отменяется.
Этот перенос данных затрагивает более или менее 40.000 строк в базе данных.
from django.db import migrations
def link_answers_to_default_segment(apps, schema_editor):
"""Create a default segment for each company"""
Company = apps.get_model('brand_score', 'Company')
Segment = apps.get_model('brand_score', 'Segment')
Answer = apps.get_model('brand_score', 'Answer')
for company in Company.objects.all():
default_segment = Segment.objects.create(company=company, name='default')
answers = Answer.objects.filter(participant__company=company)
for answer in answers:
answer.segment = default_segment
Answer.objects.bulk_update(answers, ['segment'])
class Migration(migrations.Migration):
dependencies = [
('brand_score', '0025_auto_20211209_1412'),
]
operations = [
migrations.RunPython(link_answers_to_default_segment, reverse_code=migrations.RunPython.noop),
]
Я изменил код, чтобы сохранять в каждой итерации, таким образом убрав bulk_update. После этого все заработало!
for company in Company.objects.all():
default_segment = Segment.objects.create(company=company, name='default')
answers = Answer.objects.filter(participant__company=company)
for answer in answers:
answer.segment = default_segment
answer.save()
Я до сих пор не знаю, почему сейчас это работает, а раньше нет. И если это проблема Django или Digital Ocean
Если кто-то знает, почему он так себя ведет, было бы здорово.