在 Python 中使用 cx_Oracle 中的 executemany() 从批量插入数据加载中查找错误记录
Posted
技术标签:
【中文标题】在 Python 中使用 cx_Oracle 中的 executemany() 从批量插入数据加载中查找错误记录【英文标题】:Finding erroneous records from batch insert data load with executemany() in cx_Oracle in Python 【发布时间】:2021-03-03 23:04:06 【问题描述】:使用 cx_Oracle 库通过 python 3 将数据加载到 oracle。这是代码sn-p:
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])
它在插入和给出错误消息时工作正常。 但是,我需要有错误的记录并将其保存在文件中。 试图通过 Row Offset 找到记录,但它没有给出正确的记录。 我怎样才能得到错误的记录? 请提出前进的道路。
【问题讨论】:
供未来读者参考,cx_Oracle 文档位于Batch Statement Execution and Bulk Loading。 【参考方案1】:您可以添加一个列表(err
),并将您的错误消息附加到此列表中,并以w
模式创建一个新文件,以便将消息逐行写入其中,例如以下代码:
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')
【讨论】:
谢谢,但问题是获取插入失败的错误记录@barbaros 嗨@Leon,你已经通过Row Offset
管理了。
实际上它没有给出正确的行...这就是问题...实际的行偏移量是多少?
行偏移值等于行号 - 1(因为列表索引从零开始)。如果你想要这个,我可以将str(error.offset)
替换为str(error.offset+1)
@Leon
发现问题。 error.offset 是整数值。这就是为什么当记录数高于整数变量限制时,error.offset
的值被重置并给出错误值@Barbaros以上是关于在 Python 中使用 cx_Oracle 中的 executemany() 从批量插入数据加载中查找错误记录的主要内容,如果未能解决你的问题,请参考以下文章
在 Python 中使用 cx_Oracle 和 xlrd 列出列表的 executemany() 正在返回 TypeError
使用 cx_Oracle 中 csv 文件中的变量更新数据库
cx_Oracle.NotSupportedError:无法将 Python 值转换为数据库值