У меня есть скрипт для копирования 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()
К настоящему времени это решает мою текущую проблему, но я не уверен, является ли это лучшим вариантом, или я могу получить другую проблему с другими входами.
Это лучший способ управлять этими исключениями?