Как перехватить psycopg2.DataError и psycopg2.errors.BadCopyFileFormat без коллизий - PullRequest
0 голосов
/ 07 февраля 2020

У меня есть скрипт для копирования CSV в мою базу данных в postgresql. CSV поступает из разных источников, поэтому мне приходится обрабатывать разные ошибки, связанные с форматом CSV. По сути, блок кода basi c выглядит примерно так:

import psycopg2
...

connection = psycopg2.connect(
        host=host, database=database, user=user, password=password)

try:
        file_object = open(cleaned_file)
        cur = connection.cursor()

        copy_sql = """
            COPY %s"""+headers_tostring + """FROM stdin WITH CSV HEADER
            DELIMITER as E'""" + delimiter + "'"
        copy_sql = (copy_sql + " QUOTE E'" + quote + "'") if quote != '' else copy_sql
        copy_sql = copy_sql + " NULL AS ''" 

        cur.copy_expert(sql=copy_sql % schema_table, file=file_object)
        connection.commit()
        cur.close()
    except psycopg2.ProgrammingError as e:
        print ('psycopg2.ProgrammingError')
        print(("Unexpected error:", sys.exc_info()[0]))
        #do something 
        connection.rollback()

    except psycopg2.DataError as e:
        print ('psycopg2.DataError')
        print (e)
        print(("Unexpected error:", sys.exc_info()[0]))
        #do something 
        connection.rollback()

    except psycopg2.errors.BadCopyFileFormat as e:
        print ('psycopg2.errors.BadCopyFileFormat')
        print (e)
        print(("Unexpected error:", sys.exc_info()[0]))
        #do something 
        connection.rollback()




    finally:
        connection.close()

Моя главная проблема заключалась в том, что, когда я получил ошибку типа psycopg2.errors.BadCopyFileFormat, эта ошибка перехватывается как psycopg2.DataError. Я предположил, что psycopg2.errors.BadCopyFileFormat является подклассом psycopg2.DataError и по этой причине это произошло. Проверяя документацию, я получил, что BadCopyFileFormat - это классы исключений SQLSTATE, а базовый класс - DataError, и это могло бы объяснить это.

Теперь я решаю свою проблему, меняя порядок исключения блока, поставленного перед psycopg2.errors.BadCopyFileFormat и после psycopg2.DataError

 except psycopg2.errors.BadCopyFileFormat as e:
        print ('psycopg2.errors.BadCopyFileFormat')
        print (e)
        print(("Unexpected error:", sys.exc_info()[0]))
        #do something 
        connection.rollback()
   except psycopg2.DataError as e:
        print ('psycopg2.DataError')
        print (e)
        print(("Unexpected error:", sys.exc_info()[0]))
        #do something 
        connection.rollback()

К настоящему времени это решает мою текущую проблему, но я не уверен, является ли это лучшим вариантом, или я могу получить другую проблему с другими входами.

Это лучший способ управлять этими исключениями?

...