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

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

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

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

我的问题是 –

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

  2. 假设整个操作需要很多时间,是否有可能从数据库中获取暂停? 我记得之前有类似的东西,我正在通过cx_Oracle运行一个非常长的查询,几个小时后,有一个超时,连接丢失。 关于这个还能做什么?

  3. 这个概念有什么好处? 也许有更好的方法来实现呢?

谢谢!

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

提前准备语句可以避免重复编译相同的SQL INSERT。 每行不要做一个插入,它会很慢。

Executmany做了许多插入一举。

现在,有两种基本的方法可以去 – 配料是一种方法。 批处理的问题是您必须devise批处理方法,select编号等等。 更大的批次将会更有效率,但是您必须考虑内存的折衷(您可能不能立刻适应所有的事情)。

你的另一种方法是在Python中使用一个生成器 。 也就是说,根据需要制作一个懒惰构build的列表。 你可以有效地创build一个无限大小的列表,将其生成为executemany使用的executemany

此外, 请阅读有关高性能插入与python /甲骨文相关问题的答案 。