Ne peut pas exécuter des requêtes jusqu'à la fin de la atomique en bloc dans ma migration des données sur django 1.7

J'ai une assez longue migration de données que je suis en train de faire pour corriger le plus tôt mauvais migration, où certaines lignes ont été créées de manière incorrecte. Je suis en train d'affecter des valeurs à une nouvelle colonne basée sur les anciens, cependant, cela conduit parfois à des erreurs d'intégrité. Lorsque cela arrive, j'ai envie de jeter celui qui est la cause de l'erreur d'intégrité

Voici un extrait de code:

def load_data(apps, schema_editor):
    MyClass = apps.get_model('my_app', 'MyClass')

    new_col_mapping = {old_val1: new_val1, ....}

    for inst in MyClass.objects.filter(old_col=c):

        try:
            inst.new_col = new_col_mapping[c]
            inst.save()

        except IntegrityError:
            inst.delete()

Puis dans le fonctionnement de mon Migration classe je ne

operations = [
    migrations.RunPython(load_data)
]

J'obtiens l'erreur suivante lors de l'exécution de la migration

django.db.transaction.TransactionManagementError: An error occurred in the current transaction. You can't execute queries until the end of the 'atomic' block

J'ai le sentiment que cela

with transaction.atomic():

quelque part c'est ma solution mais je ne suis pas sûr de savoir exactement où le droit de place est. Plus important encore, je voudrais comprendre POURQUOI cela est nécessaire

OriginalL'auteur sedavidw | 2015-08-25