Обработка ошибок Python Psycopg и соединения (v MySQLdb) - PullRequest
2 голосов
/ 16 сентября 2008

Есть ли способ заставить 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

Ответы [ 2 ]

2 голосов
/ 21 января 2009

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

2 голосов
/ 16 сентября 2008

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

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

...