Vorrei scrivere una migrazione dei dati in cui modifico tutte le righe di una grande tabella in gruppi più piccoli per evitare problemi di blocco. Tuttavia, non riesco a capire come eseguire il commit manualmente in una migrazione di Django. Ogni volta che provo a correre commit
ottengo:Esegui manualmente nella migrazione dei dati di Django
TransactionManagementError: This is forbidden when an 'atomic' block is active.
AFAICT, il database schema editor always wraps Postgres migrations in un atomic block.
Esiste un modo corretto per interrompere la transazione dall'interno della migrazione?
La mia migrazione simile a questa:
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),
]
sto usando Django 1.7 e Postgres 9.3. Funzionava con le versioni sud e precedenti di Django.
Grazie. L'ho già provato, ma in realtà non rimuove il contesto atomico attorno alla migrazione (almeno per Postgres). – Pankrat
Curioso, perché qui è il codice in django.db.migration.py: 'se non schema_editor.connection.features.can_rollback_ddl e operation.atomic:' - 'se non schema_editor.connection.features.can_rollback_ddl e operation.atomic: con atomic (schema_editor.connection.alias): ... '. Sei positivo, qualcos'altro non sta succedendo? Forse impostare un breakpoint lì (è la riga 109 in django 1.8)? –
Sì, questo evita di rendere l'operazione atomica ma l'editor dello schema del database rende tuttora l'intera migrazione atomica: https://github.com/django/django/blob/stable/1.7.x/django/db/backends/schema.py # L85 – Pankrat