使用cx_Oracle插入行并记录那些失败的行?

问题描述:

我想要做的是使用cx_Oracle插入一堆行,如果有错误(即违反约束),则记录错误的行。使用cx_Oracle插入行并记录那些失败的行?

下面是我如何使用execute执行的sudo代码,但这看起来效率不高。

for row in rows: 
    try: 
     cursor.execute("sql", row) 
    except InsertError: 
     badRecordCSVFile.write(row) 

我看docs,起初它似乎像executemany就是我一直在寻找。然而,看完这个thread它似乎executemany只是处理查询,直到它失败(不是我想要的)。

所以我的问题是插入行并记录失败的最佳方式是什么?

+1

[DML错误日志记录]可能有所帮助。你的意思是INSERT INTO myTable(col1,col2)VALUES(:val1:va​​l2)'SQL参数的 – 2013-02-14 06:51:31

如果您为插入语句使用SQL参数,则此效率足够高;瓶颈将在与Oracle的网络通信中。

通过使用SQL参数,Oracle有机会准备一个查询计划,然后在每个插入中重复使用它。

但是,如果您计划在插入失败时回滚事务,则最好使用.executemany()

+0

? – John 2013-02-13 17:55:45

+0

@johnthexiii:是的,确切的。 – 2013-02-13 17:56:50