psycopg2: курсор уже закрыт

Я использую psycopg2 2.6.1 . У меня есть куча запросов, которые мне нужно выполнить последовательно.

 conn = psycopg2.connect(database=redshift_database, user=redshift_user, password=os.environ.get("PGPASSWORD"), host=redshift_cluster, port=redshift_port) cursor = conn.cursor() queries = [q1, q2, q3....] ## a list of queries for query in queries: try: cursor.execute(query) except: print e.message 

Предположим, что отказ q1 с SSL connection has been closed unexpectedly . Затем мои остальные запросы также терпят неудачу, когда cursor already closed . Как я могу гарантировать, что если один запрос завершится с ошибкой, то следующие запросы будут выполнены успешно.

Предположительно, если соединение упало, вам нужно будет восстановить его и получить еще один курсор в обработчике исключений:

 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(...) , поэтому вы должны это обработать.

Вы должны явно регенерировать курсор в блоке except, если на более низком уровне что-то пошло не так, что запрос:

 for query in queries: try: cursor.execute(query) except: print e.message try: cursor.close() cursor = conn.cursor() except: conn.close() conn = psycopg2.connect(...) cursor = conn.cursor()