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

StackOverflow https://stackoverflow.com/questions/70681

  •  09-06-2019
  •  | 
  •  

Вопрос

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

Решение

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

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

Другие советы

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

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top