Python插入数据到Oracle时的一些小问题

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无效的数字,真的是很奇怪,记录一下。。。。

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值