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 . Как я могу гарантировать, что если один запрос завершится с ошибкой, то следующие запросы будут выполнены успешно.

2 Solutions collect form web for “psycopg2: курсор уже закрыт”

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

 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() 
  • Как вставить значения «NULL» в базу данных PostgreSQL с помощью Python?
  • Обновление параллельной таблицы с использованием многопроцессорности python (PostGIS / PostgreSQL)
  • Невозможно «COPY FROM» с помощью Postgres & Python
  • Выполнить .sql-схему в psycopg2 в Python
  • Ошибка установки psycopg2 - Библиотека не загружена: libssl.dylib
  • Проблема с psycopg2 в virtualenv python3 для использования с Django
  • Открытие соединения postgres в psycopg2 приводит к сбою python
  • Python psycopg2 курсоры
  •  
    Interesting Posts for Van-Lav

    Python 3.x: переход к следующей строке

    Удовлетворение LD_LIBRARY_PATH и проблемы с компиляцией

    Создание 3D-массива из 2D-массива путем репликации / повторения вдоль первой оси

    Замените пустые строки значениями None / null в DataFrame

    эффективно находить интервал с не-нулями в scipy / numpy в Python?

    Многопроцессор Python с использованием пула не работает на AWS Ubuntu

    Numpy intersect1d с массивом с матрицей в качестве элементов

    Получение 16-битных целых чисел в Python

    проанализировать с помощью регулярного выражения и распечатать строку

    python a == b вызывает b .__ eq __ (a) для подкласса без переопределения

    почему перекрестная проверка для RandomForestRegressor терпит неудачу в scikit-learn

    Emacs Cc Cc для кода python

    Как печатать все значения переменных при отладке Python с помощью pdb без указания каждой переменной?

    Как правильно обернуть std :: vector <std :: size_t> с помощью SWIG для Python? Проблемы с std :: size_t

    Как скомпилировать зависимости C ++ во время установки pip?

    Python - лучший язык программирования в мире.