Przypuszczalnie, jeśli połączenie zostało zerwane, będziesz musiał je ponownie nawiązać i umieścić kolejny kursor w obsłudze wyjątków:
for query in queries:
try:
cursor.execute(query)
except Exception as e:
print e.message
conn = psycopg2.connect(....)
cursor = conn.cursor()
Powinieneś być bardziej szczegółowy z wyjątkami, które łapiesz. Zakładając InterfaceError
wyjątek, jeśli kursor jest jakoś zamknięty, możesz to złapać w ten sposób:
except psycopg2.InterfaceError as e:
Mogą wystąpić inne, mniej drastyczne problemy, które uniemożliwią wykonanie kolejnych zapytań, np. transakcja została przerwana. W takim przypadku musisz wycofać bieżącą transakcję, a następnie spróbować następnego zapytania:
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()
Tutaj zapytanie jest wypróbowywane w nieistniejącej tabeli. ProgrammingError
zgłoszony jest wyjątek, a połączenie musi zostać wycofane, jeśli ma zostać wykonana inna kwerenda. Drugie zapytanie powinno się udać.
To pomija szczegóły dalszych wyjątków zgłaszanych w samych procedurach obsługi wyjątków, np. connect(...)
może się nie powieść podczas próby ponownego nawiązania połączenia, więc powinieneś sobie z tym poradzić.