将excel行加载到数据库的有效方法?

时间:2014-09-08 19:04:00

标签: python sql excel oracle cx-oracle

我们有大量的Excel文件(最多100行,最多150列,大约30%的列包含长文本对象。文件大小从10mb到60mb不等)。

我需要以最有效的方式将这些加载到我们的Oracle数据库中。

我想过用 xlrd 加载每个Excel文件,然后为每个Excel行创建一个 INSERT 语句,然后执行我的SQL cx_Oracle。

我的问题是 -

  1. 我应该为每一行创建一个INSERT语句,然后执行它(意味着大量的cursor.execute(sql)调用),或者我应该有一个包含所有插入的大量字符串(用分号分隔) ),这意味着我只有一个cursor.execute(sql)调用?

  2. 假设整个操作需要很长时间,我是否有可能从数据库中获得超时?我记得刚才有类似的东西,我通过cx_Oracle运行了一个非常长的查询,几个小时后出现超时,连接丢失了。可以做些什么呢?

  3. 这个概念有什么用吗?或许还有更好的方法来实现这个目标吗?

  4. 谢谢!

1 个答案:

答案 0 :(得分:1)

简短的回答是,您应该使用Cursor.prepare(statement[, tag])Cursor.executemany(statement, parameters)

提前准备语句可以省去一遍又一遍地重新编译相同的SQL INSERT。不要每行插入一次,否则会很慢。

Executmany一举完成许多插入。

现在,有两种基本方法可以实现 - 批处理是一种方式。批处理的问题是您必须设计批处理方法,选择数字等。更大的批次将更有效,但你必须考虑内存权衡(你可能不能同时适应所有内容)。

你的另一种方法是在python中使用generator。也就是说,制作一个根据需要生成的惰性构造列表。您可以通过生成executemany消耗的列表来有效地创建无限大小的列表。

另外,please read the answer to this related question关于使用python / oracle的高性能插入。