Graceful Manejo de errores de clave primaria en Python / psycopg2

Utilizando Python 2.7 y

In [150]: psycopg2.versió Out [150]: '2.4.2 (dt dec pq3 ext)'

Tengo scripts de Python simples que procesan transacciones y escriben datos en una base de datos. De vez en cuando hay una inserción que viola mi clave principal. Esto está bien, solo quiero que ignore ese registro y continúe felizmente. El problema que tengo es que el error de la clave primaria psycopg2 está abortando todo el bloque de transacciones y todas las inserciones después del error. Aquí hay un error de ejemplo

ERROR: duplicate key value violates unique constraint "encounter_id_pkey"
DETAIL:  Key (encounter_id)=(9012235) already exists.

Esto está en el siguiente inserto. no es una violación.

Inserting: 0163168~9024065
ERROR: current transaction is aborted, commands ignored until end of transaction block

El segundo error se repite para cada inserción. Aquí hay un bucle simplificado. Estoy recorriendo un marco de datos de pandas, pero podría ser cualquier bucle.

conn = psycopg2.connect("dbname='XXXX' user='XXXXX' host='XXXX' password='XXXXX'")

cur = conn.cursor()

for i, val in df2.iteritems():
    try:
        cur = conn.cursor()
        cur.execute("""insert into encounter_id_table (
        encounter_id,current_date  )
        values       
        (%(create_date)s, %(encounter_id)s ) ;""",
        'encounter_id':i.split('~')[1],  
        'create_date': datetime.date.today() })           
        cur.commit()
        cur.close() 
    except Exception , e:
        print 'ERROR:', e[0]
        cur.close()
 conn.close()   

De nuevo, la idea básica es manejar con gracia el error. En el dictamen del almirante Nelson de la Royal Navy: "Maldita sea, las maniobras van directamente hacia ellos". O en nuestro caso, los errores van directamente a ellos ". Pensé al abrir un cursor en cada inserción que restablecería el bloque de transacciones. No quiero tener que restablecer la conexión solo por un error de clave principal. Es hay algo que solo me estoy perdiendo?

Gracias de antemano por su tiempo.

Joh

Respuestas a la pregunta(4)

Su respuesta a la pregunta