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