Изящная обработка ошибок первичного ключа в Python / psycopg2

Использование Python 2.7 и

В [150]: psycopg2. версия Out [150]: '2.4.2 (dt dec pq3 ext)'

У меня есть простые сценарии Python, которые обрабатывают транзакции и записывают данные в базу данных. Иногда бывает вставка, которая нарушает мой первичный ключ. Это нормально, я просто хочу, чтобы он проигнорировал эту запись и продолжил ее весело.Проблема, с которой я столкнулся, заключается в том, что ошибка первичного ключа psycopg2 прерывает весь блок транзакции и все вставки после сбоя ошибки. Вот пример ошибки

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

Это на следующей вставке. не нарушение.

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

Вторая ошибка повторяется для каждой вставки. Вот упрощенный цикл. Я просматриваю фрейм данных pandas, но это может быть любой цикл.

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()   

И снова основная идея - аккуратно обработать ошибку. В изречении адмирала Королевского флота Нельсона: «Черт возьми, маневры идут прямо на них». Или в нашем случае, черт возьми, Ошибки идут прямо на них ». Я подумал, открывая курсор на каждой вставке, что сбрасываю блок транзакции. Я не хочу, чтобы мне приходилось сбрасывать соединение только из-за ошибки первичного ключа. Есть что-то, чего мне просто не хватает?

Заранее спасибо за уделенное время.

Джон

18
задан jdennison 13 December 2011 в 23:48
поделиться