#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)
@Leon5. Обнаружена проблема. ошибка.смещение — целочисленное значение. Вот почему, когда число записей превышает предел целочисленной переменной, значение
error.offset
сбрасывается и выдает неправильное значение @Barbaros