Предполага се, че ако връзката е прекъсната, ще трябва да я възстановите и да получите друг курсор в манипулатора на изключения:
for query in queries:
try:
cursor.execute(query)
except Exception as e:
print e.message
conn = psycopg2.connect(....)
cursor = conn.cursor()
Трябва да сте по-конкретни с изключенията, които хващате. Приемане на InterfaceError
изключение, ако курсорът е затворен по някакъв начин, можете да го уловите по този начин:
except psycopg2.InterfaceError as e:
Може да има други по-малко драстични проблеми, които ще попречат на изпълнението на последващи заявки, напр. транзакцията е прекратена. В такъв случай трябва да върнете назад текущата транзакция и след това да опитате следващата заявка:
queries = ['select count(*) from non_existent_table', 'select count(*) from existing_table']
for query in queries:
try:
cursor.execute(query)
except psycopg2.ProgrammingError as exc:
print exc.message
conn.rollback()
except psycopg2.InterfaceError as exc:
print exc.message
conn = psycopg2.connect(....)
cursor = conn.cursor()
Тук се опитва заявка срещу несъществуваща таблица. ProgrammingError
е повдигнато изключение и връзката трябва да бъде върната, ако трябва да се направи опит за друга заявка. Второто запитване трябва да е успешно.
Това прикрива подробностите за допълнителни изключения, повдигнати в самите манипулатори на изключения, напр.connect(...)
може да се провали при опит за възстановяване на връзката, така че трябва да се справите и с това.