Я бы хотел написать миграцию данных, где я изменяю все строки в большой таблице меньшими партиями, чтобы избежать проблем с блокировкой. Однако я не могу понять, как вручную выполнить перенос Django. Каждый раз, когда я пытаюсь запустить commit
, я получаю:
TransactionManagementError: это запрещено, когда активен блок "атомный".
AFAICT, редактор схемы базы данных всегда переносит миграции Postgres в атомный блок.
Есть ли разумный способ выйти из транзакции из миграции?
Моя миграция выглядит следующим образом:
def modify_data(apps, schema_editor):
counter = 0
BigData = apps.get_model("app", "BigData")
for row in BigData.objects.iterator():
# Modify row [...]
row.save()
# Commit every 1000 rows
counter += 1
if counter % 1000 == 0:
transaction.commit()
transaction.commit()
class Migration(migrations.Migration):
operations = [
migrations.RunPython(modify_data),
]
Я использую Django 1.7 и Postgres 9.3. Это использовалось для работы с южными и более старыми версиями Django.