在 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 值转换为数据库值

python cx_Oracle 游标不返回有效查询的行

如何使用 cx_Oracle 在 Python 中返回 SQLPLUS 变量

使用Python解决Cx_Oracle查询时UnicodeDecodeError的问题