Aplicación roscada + IntegrityError
-
06-07-2019 - |
Pregunta
Tengo la aplicación de hilos de Python + Postgres. Estoy usando el ORM de Django
guardar en Postgres ..
Tengo llamadas guardadas concurrentes. Ocasionalmente, 2 hilos guardan con el
misma clave primaria que conduce a un problema.
Registro de Postgres:
ERROR: el valor duplicado de la clave viola la restricción única " store_pkey "
DECLARACIÓN: INSERTAR EN " almacenar " (" store_id " ;, " address ") VALUES
(E'HAN277 ', E'101 Ocean Street')
Código:
En el código veo un IntegrityError. Intenté diferentes formas de manejar
esta.
a.
prueba:
a.save ()
excepto IntegrityError:
pasar
Esto causa InternalError
b. Intenté revertir las transacciones ... pero no estoy seguro ... Por lo que a mí respecta entiendo que necesita distinguir guardar llamadas para tener transacciones
sid = transaction.savepoint()
try:
row.save()
except IntegrityError, e:
transaction.savepoint_rollback(sid)
pass
transaction.commit()
El primer punto de rescate falla con
AttributeError: el objeto 'NoneType' no tiene el atributo 'cursor'
a. Leí en alguna parte que django no es 100% seguro para subprocesos. Es un buen
elección en mi caso de uso. Ya estaba usando Django para otra aplicación
y necesito un ORM .. Así que, naturalmente, elegí Django
segundo. Cómo manejar esta situación. Cualquier comentario.
Gracias y saludos, Ramya
Solución
Solo para asegurarse, ¿está usando cadenas para las claves principales si lo entiendo correctamente?
AttributeError: el objeto 'NoneType' no tiene el atributo 'cursor'
Esto significa que hay un error en algún código de Python. ¿Has intentado usar otra versión o revisión de Django o buscando el error de Django trac? No es tan raro verse afectado por algún error si está utilizando la versión de troncal.
Como alternativa, también podría intentar implementar Django usando múltiples procesos en lugar de múltiples hilos si esa es una opción.
Sin embargo, es posible que aún desee saber por qué recibe solicitudes duplicadas, ya que podría descubrir algún otro error.