Поиск ошибочных записей при загрузке данных пакетной вставки с помощью executemany() в cx_Oracle в Python

#python #python-3.x #oracle #cx-oracle

#питон #python-3.x #Oracle #cx-oracle

Вопрос:

Загрузка данных в oracle через python 3 с использованием библиотеки cx_Oracle. Вот фрагмент кода:

 for fl in processing_list:
    fname = fl.split('/')[-1]
    data_set = []
    data_reader = csv.reader(open(fl,'r'),delimiter='|')
    for rec in data_reader:
        rec.insert(0,fname)
        data_set.append(rec)
    curs.executemany('insert into test_sdp_dump values(:1,:2,:3,:4,:5,:6,:7,:8,:9,:10,:11,:12,:13,:14,:15,:16,:17,:18,:19,:20,:21,:22,:23,:24,:25,:26,:27,:28,:29,:30,:31,:32,:33,:34,:35,:36,:37,:38,:39,:40,:41,:42,:43,:44,:45,:46,:47,:48,:49,:50,:51,:52,:53,:54,:55,:56,:57,:58,:59,:60,:61,:62,:63,:64,:65,:66,:67,:68,:69,:70,:71,:72,:73,:74,:75,:76,:77,:78,:79,:80,:81,:82,:83,:84,:85,:86,:87,:88,:89,:90,:91,:92,:93,:94,:95,:96,:97)',data_set,batcherrors=True)
    
    for error in curs.getbatcherrors():
        print('Error Message:'   error.message   'Row Offset:'   str(error.offset))
        print(data_set[error.offset])
 

Он отлично работает при вставке и выдаче сообщения об ошибке.
Однако мне нужно иметь ошибочные записи и сохранить их в файле.
Попытался найти запись с помощью смещения строки, но это не дает правильных записей.
Как я могу получить ошибочные записи?
Любезно предложите дальнейший путь.

Комментарии:

1. Для справки для будущих читателей документация cx_Oracle по этому вопросу находится в разделе Выполнение пакетных инструкций и массовая загрузка .

Ответ №1:

Вы можете добавить list( err ) и добавить свои сообщения об ошибках в этот список, а также создать новый файл в w режиме mode, чтобы записывать в него сообщения построчно, например, приведенный ниже код :

 curs.executemany('INSERT INTO test_sdp_dump VALUES(:1,:2,..)',data_set,batcherrors=True)
err = []    
for error in curs.getbatcherrors():
    print(data_set[error.offset])
    err.append('Error Message:'   error.message   ' - Row Offset:'   str(error.offset 1))

with open('err.txt','w') as f_out:
        for i in err:
                f_out.write(''.join(i)   'n') 
 

Комментарии:

1. спасибо, но вопрос заключался в том, чтобы получить ошибочную запись, для которой вставка не удалась @barbaros

2. привет, @Leon , ты уже справился с этим Row Offset .

3. на самом деле это не дает правильную строку … вот в чем проблема… какое смещение строки на самом деле?

4. значения смещения строки точно равны номеру строки — 1 (поскольку индексы списка начинаются с нуля). Если вы этого хотите, я могу заменить str(error.offset) на str(error.offset 1) @Leon

5. Обнаружена проблема. ошибка.смещение — целочисленное значение. Вот почему, когда число записей превышает предел целочисленной переменной, значение error.offset сбрасывается и выдает неправильное значение @Barbaros