python单条插入
cursor.execute(sql_execute)
当数据量大时,上面的语句执行速度就慢了,所以,将上面的单条插入改为批量插入
python批量插入
前面的参数是sql语句,后面参数是list,该list里面存放的是元祖
cursor.executemany(insert_sql, insert_args)
如下图:
demo_data = [('xxx', 2), ('xxx2', 3)]
dem_sql = ''' insert into T_XXX_DEMO(DEPNO, DEPNAME, DEPCOUNT) VALUES (:1, '3', :2) '''
oracle_risk.batchInsert(dem_sql, demo_data)
我这里将executemany进行了一次封装,实际上和直接使用executemany一样
使用时注意下面几点:
1. demo_data数组中数据必须全部被使用
values里面的:1,:2 必须和demo_data中的数据相匹配,不能多一个,也不能少一个
例如,我将上面的代码改为下图,注意冒号:
demo_data = [('xxx', 2), ('xxx2', 3)]
dem_sql = ''' insert into T_XXX_DEMO(DEPNO, DEPNAME, DEPCOUNT) VALUES (:1, '3', 5) '''
oracle_risk.batchInsert(dem_sql, demo_data)
其中values里面的 :2改为了5,那么运行时就会报这个错误:
2. 注意插入字段的最后一个位置是否多出来一个逗号
demo_data = [('xxx', '33 '), ('xxx2', '33')]
dem_sql = ''' insert into T_XXX_DEMO(DEPNO, DEPCOUNT,DEPNAME,) VALUES (:1, 2, :2) '''
oracle_risk.batchInsert(dem_sql, demo_data)
如果多出来一个逗号,则会报出下面的错误,一定要认真
3 .提交操作
执行一次插入、更新、删除、就执行一次commit操作,会影响插入效率
def update(self, sql_execute):
self.cursor.execute(sql_execute)
# self.conn.commit()
def delete(self, sql_execute):
self.cursor.execute(sql_execute)
# self.conn.commit()
def insert(self, sql_execute):
self.cursor.execute(sql_execute)
# self.conn.commit()
这种做法执行单条操作的时候没问题,但执行的数据量大的时候速度极慢、且不严谨,一但程序中断,数据库就会产生脏数据
最好的方法就是单独把conn.commit()封装起来,统一增、删、改后再执行
4. ORA-01722 无效数字的问题
执行批量插入时,sql语句一直报无效数字的问题......很恶心
调试过程:
把对应的数据和sql语句放到navicat里执行,或者使用上面的单独插入语句执行都不会报出这个错误
批量就会报这个错误,刚开始以为是查询的表格数据有None值、或者脏数据、排查后不是。
然后怀疑是元祖进行转换赋值的问题,排查后还不是
然后将sql里面的:1,:4,:2,:3:改为1,:2,:3,:4时进行插入就可以了,不再报这个错误
可是我上面写的demo中,1,:2,:3,:4为乱序就可以插入了,而这条sql的按照乱序就不行(insert里面的字段位置我也进行了调换)
一直会报出该数ORA-01722无效的数字,真的是很奇怪,记录一下。。。。