2011-09-02 9 views
14

Sapevo come fare, ma ho dimenticato. A volte, mentre usi la shell Django, commetti un errore e la transazione si interrompe. Dopodiché, qualsiasi ulteriore query verrà eseguita in DatabaseError: la transazione corrente viene interrotta, i comandi ignorati fino alla fine del blocco della transazione. Tuttavia, penso che ci sia un modo per eseguire il rollback della transazione quando ciò avviene manualmente, quindi non è necessario riavviare la sessione. Qualcuno può dirmi cos'è?Come si esegue il rollback durante la sessione della shell Django dopo aver causato DatabaseError?

Questa segnalazione di bug (https://code.djangoproject.com/ticket/10813) fa riferimento alla tecnica ma non la spiega. Eseguendo i risultati di django.db.transaction.rollback in "TransactionManagementError: questo codice non è in gestione delle transazioni".

risposta

20

Questo mi succede sempre quando uso Postgres ed è davvero irritante.

desiderato:

from django.db import transaction 
transaction.rollback() 

Il più delle volte questo va bene (e nella mia esperienza, è sicuro di ignorare il TransactionManagementError).

+0

Grazie. Ho anche iniziato a mettere la mia sessione sotto gestione delle transazioni sin dall'inizio. Rende comunque le cose un po 'più sicure. –

7

Questo è leggermente migliore, perché si arriva alcuna traccia di stack su TransactionManagementError:

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

Grazie! Ho avuto un po 'di caricamento del codice in 'signals.py' che faceva riferimento a ORM' .get() 'prima che potesse verificarsi syncdb, e questo era il cerotto che mi serviva. (Sai, invece di correggere il mio codice per evitare del tutto la query del database!) – pztrick

Problemi correlati