2011-09-02 12 views
14

Solía ​​saber cómo hacer esto, pero lo olvidé. A veces, al usar el intérprete de comandos de Django, comete un error y provoca el aborto de la transacción. Después de eso, cualquier otra consulta que realice dará como resultado el error DatabaseError: la transacción actual se cancela, los comandos se ignoran hasta el final del bloqueo de la transacción. Sin embargo, creo que hay una forma de deshacer la transacción cuando esto sucede manualmente, por lo que no tiene que reiniciar su sesión. ¿Puede alguien decirme qué es esto?¿Cómo se retrotrae durante la sesión de shell de Django después de causar DatabaseError?

Este informe de error (https://code.djangoproject.com/ticket/10813) hace referencia a la técnica pero no la explica. La ejecución de django.db.transaction.rollback da como resultado "TransactionManagementError: este código no se encuentra en la gestión de transacciones".

Respuesta

20

Esto me pasa todo el tiempo cuando uso Postgres, y es realmente irritante.

que desee:

from django.db import transaction 
transaction.rollback() 

mayoría de las veces esto está muy bien (y en mi experiencia, es seguro hacer caso omiso de la TransactionManagementError).

+0

Gracias. También me he tomado la tarea de poner mi sesión bajo gestión de transacciones desde el principio. Hace las cosas un poco más seguras de todos modos. –

7

Esto es un poco mejor, porque no se obtiene ningún seguimiento de la pila sobre TransactionManagementError:

from django.db import transaction 
transaction.rollback_unless_managed() 
+0

¡Gracias! Tenía un código de carga en 'signals.py' que hacía referencia a ORM' .get() 'antes de que ocurriera syncdb, y esta era la curita que necesitaba. (Ya sabes, ¡en lugar de arreglar mi código para evitar la consulta de la base de datos por completo!) – pztrick

Cuestiones relacionadas