2008-09-16 8 views
2

Есть ли способ заставить psycopg и postgres обрабатывать ошибки без необходимости восстановления соединения, например MySQLdb? Прокомментировал версию ниже работает с MySQLdb, комментарии делают работу с psycopg2:Ошибка Python Psycopg и обработка подключений (v MySQLdb)

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 
+0

Вы можете добавить код дополнений? becaue Я предполагаю, что у вас есть проблема с кавычками – Mauli 2008-09-16 09:49:52

ответ

2

Прежде всего, вы должны позволить psycopg выполнить escaping для вас, передав метод 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 откатится и начнет новую транзакцию в следующем объявлении.

2

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

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(), который специально разработан для выполнения одного и того же оператора несколько раз.

+0

Спасибо, я выполняю назначение строк, как вы предлагаете. Я думаю, что моя большая проблема заключается в том, что когда я пытаюсь добавить что-то недействительное, я теряю соединение и должен его восстановить, мне любопытно, есть ли способ сделать его более похожим на mysqldb, где ошибки можно просто пропустить w/normal Обработка исключений – unmounted 2008-09-17 07:50:11