我有一些每月的天气数据,想要将它们插入到Oracle数据库表中,但是我想要批量插入相应记录以提高效率。请问如何在Python中实现这个功能?
举个例子,假设我的表有四个字段:一个站点ID、一个日期和两个数值字段。记录通过站点ID和日期字段(组合键)进行唯一标识。每个站点需要插入的数值将保存在一个列表中,其中包含X年的完整数据,例如如果有两年的数值,则数值列表将包含24个数值。
我假设如果我想逐个插入记录,以下是我所要做的:
connection_string = "scott/tiger@testdb"
connection = cx_Oracle.Connection(connection_string)
cursor = cx_Oracle.Cursor(connection)
station_id = 'STATION_1'
start_year = 2000
temps = [ 1, 3, 5, 7, 9, 1, 3, 5, 7, 9, 1, 3 ]
precips = [ 2, 4, 6, 8, 2, 4, 6, 8, 2, 4, 6, 8 ]
number_of_years = len(temps) / 12
for i in range(number_of_years):
for j in range(12):
# make a date for the first day of the month
date_value = datetime.date(start_year + i, j + 1, 1)
index = (i * 12) + j
sql_insert = 'insert into my_table (id, date_column, temp, precip) values (%s, %s, %s, %s)', (station_id, date_value, temps[index], precips[index]))
cursor.execute(sql_insert)
connection.commit()
有没有一种批量插入的方法可以提高效率,类似我上面所做的那样? 另外,我的经验是使用Java / JDBC / Hibernate,所以如果有人能给出与Java方法相比较的解释/示例,那就更好了。
编辑:也许我需要使用cursor.executemany(),如此处所述?
非常感谢您提供任何建议、评论等。
.executemany()
方法调用来代替? - Martijn Pieters.executemany()
不是批量更新;你将执行与你有的游标一样多的DML语句...它可以使你的Python代码更加干净,但对于数据库来说并不更容易处理。您的原始数据是什么样子;它是由用户输入并存储在代码中的变量中,还是在文本文件中等等? - BenOCIstmtExecute
不支持批处理: "对于非 SELECT 语句,执行此语句的次数等于 iters - rowoff。" 在 c 源代码中,Cursor_ExecuteMany
将行数传递给Cursor_InternalExecute
,然后传递给OCIStmtExecute
。 - Ben