Извлеченный первичный ключ Обработка ошибок в 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() 

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

Спасибо за руку за ваше время.

Джон

2 Solutions collect form web for “Извлеченный первичный ключ Обработка ошибок в Python / psycopg2”

Вы должны откатить транзакцию при ошибке.

Я добавил еще одну try..except..else конструкцию в коде ниже, чтобы показать точное место, где будет происходить исключение.

 try: cur = conn.cursor() try: 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() }) except psycopg2.IntegrityError: conn.rollback() else: conn.commit() cur.close() except Exception , e: print 'ERROR:', e[0] 

Прежде всего: CURRENT_DATE является зарезервированным словом в каждом стандарте SQL, а также в PostgreSQL. Вы не можете использовать его как идентификатор без двойного цитирования. Я бы настоятельно советовал не использовать его вообще. Я переименовал столбец в curdate в моем примере

Далее, я не эксперт в синтаксисе python, но вы, похоже, изменили порядок своих столбцов-вставок:

 (%(create_date)s, %(encounter_id)s ) 

Должно быть:

 ( %(encounter_id)s, %(create_date)s) 

На ваш главный вопрос: вы можете вообще избежать проблемы, проверяя, находится ли ключ в таблице перед его использованием в команде insert:

 INSERT INTO encounter_id_table (encounter_id, curdate) SELECT 1234, now()::date WHERE NOT EXISTS (SELECT * FROM encounter_id_table t WHERE t.encounter_id = 1234); 

В синтаксисе Python это должно быть:

 cur.execute("""INSERT INTO encounter_id_table (encounter_id, curdate) SELECT %(encounter_id)s, %(create_date)s, WHERE NOT EXISTS ( SELECT * FROM encounter_id_table t WHERE t.encounter_id = %(encounter_id)s);""", {'encounter_id':i.split('~')[1], 'create_date': datetime.date.today()}) 
  • сделать python ждать, пока хранимая процедура завершит выполнение
  • Насколько подходит выбор RethinkDB вместо традиционного SQL для JSON API?
  • Подсчет отношений в SQLAlchemy
  • подключение sqlalchemy к MSAccess
  • Как заказать данные в sqlalchemy по списку
  • Как получить возвращаемое значение хранимой процедуры SQL Server с помощью pyodbc?
  • Как TRUNCATE TABLE с помощью ORM Django?
  • Каков наиболее эффективный способ вставки тысяч записей в таблицу (MySQL, Python, Django)
  • Алгоритм для четких отступов SQL-операторов (реализация Python была бы приятной)
  • Выбор отдельных значений столбцов в SQLAlchemy / Elixir
  • Введите имя столбца в качестве параметра PostgreSQL, используя psycopg2
  •  
    Interesting Posts for Van-Lav

    Селен Python пропускает необходимые элементы

    Как проверить, какую версию Numpy я использую?

    Программирование на Python с использованием неанглийского языка для ключевых слов и переменных

    Flask-Login прерывается, когда мой декоратор принимает параметры

    как сделать легкие и эффективные графики на Python

    Инструменты Python для визуализации 100k вершин и 1M Edges?

    работник не потребляет задачи после того, как сельдерей вызывается add_consumer

    В matplotlib, как вы рисуете тики оси R-стиля, указывающие наружу от осей?

    Python: как выполнить поиск в системном режиме для файла, когда доступно только имя файла (а не путь)

    Область переменных в вложенных функциях

    Python – получить путь к корневой структуре проекта

    Popen () терпит неудачу с « дескриптор недействителен» в _cleanup () иногда

    Пустой список вернулся из ElementTree findall

    Как проверить строку для определенных символов?

    Как открыть туннель SSH с помощью python?

    Python - лучший язык программирования в мире.