如何捕获psycopg2.DataError和psycopg2.errors.BadCopyFileFormat而不发生冲突

2024-09-29 19:22:28 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个脚本可以将csv复制到postgresql中的数据库中。csv来自不同的来源,因此我必须管理csv格式的不同错误。 基本的代码块就是这样的

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.BadCopyFileFormatpsycopg2.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()

到目前为止,这解决了我当前的问题,但我不确定这是最好的选择,还是我可以得到其他输入的另一个问题

这是管理此异常的最佳方法吗


Tags: infosqlassyserrorconnectionpsycopg2exc

热门问题