Recibí muchos errores con el mensaje:
"DatabaseError: current transaction is aborted, commands ignored until end of transaction block"
luego cambió de python-psycopg a python-psycopg2 como motor de base de datos del proyecto Django.
El código sigue siendo el mismo, simplemente no sé de dónde son esos errores.
python
django
postgresql
psycopg2
Jack
fuente
fuente
conn.rollback()
(donde conn es su objeto de conexión) borrará el error para que pueda ejecutar otras consultasRespuestas:
Esto es lo que hace postgres cuando una consulta produce un error e intenta ejecutar otra consulta sin antes revertir la transacción. (Puede considerarlo como una característica de seguridad, para evitar que corrompa sus datos).
Para solucionar esto, querrás averiguar en qué parte del código se está ejecutando la consulta incorrecta. Puede ser útil usar las opciones log_statement y log_min_error_statement en su servidor postgresql.
fuente
Para deshacerse del error, revierta la última transacción (errónea) después de haber arreglado su código:
Puede usar try-except para evitar que ocurra el error:
Consulte: documentación de Django
fuente
IntegrityError
y no la clase baseDatabaseError
?Entonces, me encontré con este mismo problema. El problema que tenía aquí era que mi base de datos no estaba sincronizada correctamente. Los problemas simples siempre parecen causar la mayor angustia ...
Para sincronizar su django db, desde el directorio de su aplicación, dentro de la terminal, escriba:
Editar: tenga en cuenta que si está utilizando django-south, ejecutar el comando '$ python manage.py migrate' también puede resolver este problema.
¡Feliz codificación!
fuente
python manage.py migrate <app>
... para todas mis aplicaciones.django-south
: elmigrate
comando no está integrado en django.En Flask solo necesitas escribir:
La documentación de PS va aquí https://www.postgresql.org/docs/9.4/static/sql-rollback.html
fuente
En mi experiencia, estos errores ocurren de esta manera:
No hay nada malo con la segunda consulta, pero como se detectó el error real, la segunda consulta es la que genera el error (mucho menos informativo).
editar: esto solo sucede si la
except
cláusula detectaIntegrityError
(o cualquier otra excepción de base de datos de bajo nivel), si detecta algo comoDoesNotExist
este error no aparecerá, porqueDoesNotExist
no corrompe la transacción.La lección aquí es no intentar / excepto / pasar.
fuente
Creo que el patrón que menciona el sacerdote es más probable que sea la causa habitual de este problema cuando se usa PostgreSQL.
Sin embargo, siento que hay usos válidos para el patrón y no creo que este problema deba ser una razón para evitarlo siempre. Por ejemplo:
Si se siente bien con este patrón, pero desea evitar el código explícito de manejo de transacciones en todo el lugar, entonces puede considerar activar el modo de confirmación automática (PostgreSQL 8.2+): https://docs.djangoproject.com/en/ dev / ref / bases de datos / # autocommit-mode
No estoy seguro de si hay consideraciones importantes de rendimiento (o de cualquier otro tipo).
fuente
Si obtiene esto mientras está en el shell interactivo y necesita una solución rápida, haga esto:
visto originalmente en esta respuesta
fuente
Encontré un comportamiento similar al ejecutar una transacción defectuosa en el
postgres
terminal. Nada pasó después de esto, ya quedatabase
está en un estado deerror
. Sin embargo, solo como una solución rápida, si puede permitirse el lujo de evitarrollback transaction
. Lo siguiente hizo el truco para mí:COMMIT;
fuente
Tengo el problema de silimar. La solución fue migrar db (
manage.py syncdb
omanage.py schemamigration --auto <table name>
si usa el sur).fuente
solo usa rollback
Código de ejemplo
fuente
También tuve este error, pero estaba enmascarando otro mensaje de error más relevante en el que el código intentaba almacenar una cadena de 125 caracteres en una columna de 100 caracteres:
Tuve que depurar el código para que aparezca el mensaje anterior, de lo contrario, se muestra
fuente
En respuesta a @priestc y @Sebastian, ¿qué pasa si haces algo como esto?
Acabo de probar este código y parece funcionar, falla silenciosamente sin tener que preocuparse por posibles errores y funciona cuando la consulta es buena.
fuente
Creo que la respuesta de @ AnujGupta es correcta. Sin embargo, la reversión puede generar una excepción que debería atrapar y manejar:
Si encuentra que está reescribiendo este código en varias
save()
ubicaciones, puede extraer el método:Finalmente, puede embellecerlo usando un decorador que protege los métodos que usan
save()
:Incluso si implementa el decorador anterior, es conveniente mantenerlo
try_rolling_back()
como un método extraído en caso de que necesite usarlo manualmente para casos en los que se requiera un manejo específico, y el manejo genérico del decorador no sea suficiente.fuente
Este es un comportamiento muy extraño para mí. Me sorprende que nadie haya pensado en los puntos de rescate. En mi código, la consulta fallida era comportamiento esperado:
He cambiado el código de esta manera para usar puntos de guardado:
fuente
En Flask Shell, todo lo que necesitaba hacer era
session.rollback()
superar esto.fuente
He encontrado este problema, el error aparece porque las transacciones de error no se han terminado correctamente, encontré el
postgresql_transactions
comando de Control de transacciones aquíControl de transacciones
Los siguientes comandos se utilizan para controlar las transacciones.
entonces uso el
END TRANSACTION
para finalizar el error TRANSACTION, código como este:fuente
puede deshabilitar la transacción a través de "set_isolation_level (0)"
fuente