我们有大量的Excel文件(最多100行,最多150列,大约30%的列包含长文本对象。文件大小从10mb到60mb不等)。
我需要以最有效的方式将这些加载到我们的Oracle数据库中。
我想过用 xlrd 加载每个Excel文件,然后为每个Excel行创建一个 INSERT 语句,然后执行我的SQL cx_Oracle。
我的问题是 -
我应该为每一行创建一个INSERT语句,然后执行它(意味着大量的cursor.execute(sql)调用),或者我应该有一个包含所有插入的大量字符串(用分号分隔) ),这意味着我只有一个cursor.execute(sql)调用?
假设整个操作需要很长时间,我是否有可能从数据库中获得超时?我记得刚才有类似的东西,我通过cx_Oracle运行了一个非常长的查询,几个小时后出现超时,连接丢失了。可以做些什么呢?
这个概念有什么用吗?或许还有更好的方法来实现这个目标吗?
谢谢!
答案 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的高性能插入。