目标将dataframe批量写入到Oracle数据库
writed_data = np.array(test_data) # dataframe转换array
writed_data = writed_data.tolist() # array转换list
sql = 'insert into RESULT_TABLE(c1,c2,c3,c4,c5) values(:1,:2,:3,:4,:5)'
cur = conn.cursor()
cur.executemany(sql, writed_data) # 批量执行query_sql
# 记得需要commit然后关闭
cur.close()
conn.commit()
conn.close()
上述代码前置条件:
- test_data为dataframe。
- RESULT_TABLE是数据库中的空表,需要和写入的dataframe的字段名和格式一致。
- conn是Oracle数据库的连接
- c1,c2,c3,c4,c5是dataframe的列名。
结果
可以成功批量写入到指定的表。
进一步优化
因为当dataframe的列名变多之后,重复性的工作增加,所以从这个方面进行优化。
def py_insert_oracle(columns,save_table_name):
"""
Args:
columns: 以列表的形式
save_table_name: 保存table的名字
Returns:直接的insert到Oracle的sql语句,字符串格式
"""
s = ''
for i in range(len(columns)):
s = s + columns[i] + '-'
sql_columns = s.replace('-',',')[:-1] # 不要最后输出的逗号
sql_number_str = ''
for i in range(1,len(columns)+1,1):
sql_number_str = sql_number_str + ':' + str(i) + ',' # ':1,:2,:3,:4,:5,:6'
sql_number_str = sql_number_str[:-1]
query_sql = 'insert into ' + save_table_name + '(' + sql_columns + ') values(' + sql_number_str + ') '
return query_sql
上述代码表可以自动实现sql的自动化生成,原理也就是简单的字符串拼接替换,大家想要了解更详细的化,把函数拆开,多打印点出来就可以了。
直接调用的话可以参考下面的参数输入。
columns = test_data.columns.tolist() # 获得dataframe的列名
query_sql = py_insert_oracle(columns, save_table_name = 'RESULT_TABLE')
# ---------------------------------
# 写入oracle,执行query_sql并关闭
# ---------------------------------
writed_data = np.array(test_data)
writed_data = writed_data.tolist()
cur = conn.cursor()
cur.executemany(query_sql, writed_data) # 批量执行query_sql
cur.close()
conn.commit()
conn.close()