Я хотел бы написать миграцию данных, где я изменяю все строки в большой таблице меньшими партиями, чтобы избежать проблем с блокировкой. Однако я не могу понять, как вручную выполнить перенос Django. Каждый раз я пытаюсь запустить commit
я получаю:Зафиксировать вручную в миграции данных Django
TransactionManagementError: This is forbidden when an 'atomic' block is active.
AFAICT, в database schema editor always wraps Postgres migrations в качестве atomic block.
Есть ли разумный способ выйти из транзакции из-за миграции?
Моя миграция выглядит следующим образом:
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.
Спасибо. Я уже пробовал это, но на самом деле не удаляет атомный контекст вокруг миграции (по крайней мере, для Postgres). – Pankrat
Любопытно, потому что вот код в django.db.migration.py: 'if not schema_editor.connection.features.can_rollback_ddl и operation.atomic:' - 'if not schema_editor.connection.features.can_rollback_ddl и operation.atomic: с атомарным (schema_editor.connection.alias): ... '. Вы позитивны, что-то еще не происходит? Может быть, установить там точку останова (это строка 109 в django 1.8)? –
Да, это позволяет избежать атомарности операции, но редактор схемы базы данных по-прежнему делает весь перенос атома атомом: https://github.com/django/django/blob/stable/1.7.x/django/db/backends/schema.py # L85 – Pankrat