2010-11-28 51 views
0

Je suis en train d'écrire un script d'encapsulage en vrac à l'aide de ORM + custom raw SQL de Django. Le code a le schéma suivant:Django: commit mixte et raw db commits - TransactionManagementError

import sys, os 
from django.core.management import setup_environ 
from my_project import settings 
from my_project.my_app.models import Model1, Model2 
setup_environ(settings) 
from django.db import transaction 
from django.db import connection 

@transaction.commit_manually 
def process_file(relevant_file): 

    data_file = open(relevant_file,'r') 

    cursor = connection.cursor() 

    while 1: 
     line = data_file.readline() 
     if line == '': 
      break 

     if not(input_row_i%1000): 
      transaction.commit() 

     if ([some rare condition]): 
      model_1 = Model1([Some assignments based on line]) 
      model_1.save() 

     values = [Some values based on line] 
     cursor.execute("INSERT INTO `table_1` ('field_1', 'field_2', 'field_3') VALUES (%i, %f, %s)", values) 

    data_file.close() 
    transaction.commit() 

Je continue à obtenir l'erreur suivante:

django.db.transaction.TransactionManagementError: Transaction managed block ended with pending COMMIT/ROLLBACK 

Comment puis-je résoudre ce problème?

+0

Etes-vous sûr de ne pas avoir manqué d'inclure une condition dans l'exemple de code, ce qui entraînerait l'exécution de la dernière validation()? – knutin

+0

oui, j'en suis sûr :) – Jonathan

Répondre

0

Vous pourriez essayer une solution de contournement - placez un transaction.commit() juste après le model_1.save(). Je pense que vous devez isoler les transactions brutes et ORM.

1

J'ai commencé à obtenir cette exception dans une circonstance similaire. L'ORM django lançait en fait une erreur django.core.exceptions.ValidationError car une date était mal formatée. Comme j'utilisais le traitement manuel des transactions pour écrire des bases de données par lots, le code de traitement des transactions de Django essayait de nettoyer à l'intérieur de l'exception django.core.exceptions.ValidationError et jetait sa propre exception de django.db.transaction.TransactionManagementError. Essayez d'essayer/excepté autour de votre code model_1 pour voir si d'autres exceptions sont levées. Quelque chose comme:

try: 
    model_1 ... 
    model_1.save() 
except: 
    print "Unexpected error:", sys.exc_info()[0] 
    print 'line:', line 

pour voir s'il y a des problèmes avec les données d'entrée Code objet de création.