Ошибка Python Psycopg и обработка соединения (v MySQLdb)

Есть ли способ заставить psycopg и postgres обрабатывать ошибки без необходимости переустанавливать соединение, например MySQLdb? Версия с комментариями ниже работает с MySQLdb, комментарии заставляют ее работать с Psycopg2:

results = {'felicitas': 3, 'volumes': 8, 'acillevs': 1, 'mosaics': 13, 'perat\xe9': 1, 'representative': 6....}
for item in sorted(results):
    try:
        cur.execute("""insert into resultstab values ('%s', %d)""" % (item, results[item]))
        print item, results[item]
#       conn.commit()
    except:
#       conn=psycopg2.connect(user='bvm', database='wdb', password='redacted')
#       cur=conn.cursor()
        print 'choked on', item
        continue

Это должно замедлить работу, может ли кто-нибудь предложить обход ошибок форматирования? Очевидно, что приведенное выше задыхается от апострофов, но есть ли способ заставить его пройти мимо этого, не получая что-то вроде следующего, или фиксации, повторного подключения и т. д.?:

agreement 19
agreements 1
agrees 1
agrippa 9
choked on agrippa's
choked on agrippina

person unmounted    schedule 16.09.2008    source источник
comment
Вы можете добавить код addthings? потому что я предполагаю, что у вас проблемы с цитированием   -  person Mauli    schedule 16.09.2008


Ответы (2)


Прежде всего, вы должны позволить psycopg выполнить экранирование за вас, передав параметры методу execute() вместо самостоятельного форматирования с помощью '%'. То есть:

cur.execute("insert into resultstab values (%s, %s)", (item, results[item]))

Обратите внимание, как мы используем «%s» в качестве маркера даже для нестроковых значений и избегаем кавычек в запросе. psycopg сделает за нас все цитирование.

Затем, если вы хотите игнорировать некоторые ошибки, просто откатитесь и продолжите.

try:
    cur.execute("SELECT this is an error")
except:
    conn.rollback()

Это все. psycopg откатится и начнет новую транзакцию при следующем запросе.

person fog    schedule 21.01.2009

Я думаю, что ваш код выглядит так на данный момент:

l = "a very long ... text".split()
for e in l:
    cursor.execute("INSERT INTO yourtable (yourcol) VALUES ('" + e + "')")

Поэтому попробуйте изменить его на что-то вроде этого:

l = "a very long ... text".split()
for e in l:
    cursor.execute("INSERT INTO yourtable (yourcol) VALUES (%s)", (e,))

поэтому никогда не забывайте передавать свои параметры в списке параметров, тогда вам не нужно заботиться о своих кавычках и прочем, это также более безопасно. Подробнее об этом можно прочитать на странице http://www.python.org/dev/peps/pep-0249/

также взгляните на метод .executemany(), который специально разработан для многократного выполнения одного и того же оператора.

person Mauli    schedule 16.09.2008
comment
Спасибо, я делаю назначение строк, как вы предлагаете. Я думаю, что моя большая проблема заключается в том, что когда я пытаюсь добавить что-то недействительное, я теряю соединение и должен его восстановить. Мне любопытно, есть ли способ сделать его более похожим на mysqldb, где ошибки можно просто пропустить с обычным Обработка исключений - person unmounted; 17.09.2008