用python往Oracle批量插入数据,报错
expecting string or bytes object
[(218079, Decimal('26600.00'), 53746, 0, '2021-09-28 12:40:04', '2021-10-08 17:23:35', 165576244, 44, 1, '', '', '', '', '', '2021-10-10 19:25:07', 'SZ-JY-JYL-JHSJ-2110303Ⅰ', '2021-11-01 15:21:16', 15, 1, 1), (218089, Decimal('5000.00'), 71560, 133348, '2021-10-08 00:00:00', '2021-10-08 19:43:08', 170789386, 390, 1, 218089, 71560, 100.0, 390, 1, '2021-12-03 17:03:18', 'eA-TJ4-JY-L-PT-3110069F', '', 1, 1, 1)]
insert into LYRATE_CON_DETAIL(CON_ID, DEDUCTIONS_AMT, CON_SALES_ID, IS_ECONTRACT, DK_TIME, CON_FIRST_CREATE, CUST_ID, SHOP_ID, IS_COOPERATION, CS_CON_ID, CS_SALES_ID, COOPERATE_SALES_RATE, CS_SHOP_ID, CS_IS_COOPERATION, SIGN_TIME, CONTRACT_NUM, FIRST_BIND_TIME, CONTRACT_TYPE, NUM, BRAND) values(:1, :2, :3, :4, to_date(:5, 'yyyy-mm-dd hh24:mi:ss'), to_date(:6, 'yyyy-mm-dd hh24:mi:ss'), :7, :8, :9, :10, :11, :12, :13, :14, to_date(:15, 'yyyy-mm-dd hh24:mi:ss'), :16, to_date(:17, 'yyyy-mm-dd hh24:mi:ss'), :18, :19, :20)
这是每两条循环插入的,我如果一条循环插入就不会报错,这里边的空值我已经都处理为 '' 了,看这个意思是 数值型字段,批量插入的数据中有空值就会报错
我就无语了,为什么会有这么坑的地方,已经快把我整疯了
我记得 cx_oracle 会处理空值,你试试 None
另外
'SZ-JY-JYL-JHSJ-2110303Ⅰ'
这是你贴错了,还是本来就是这个值
看了好多例子,好像并不能对 None 做处理;手上没有 Oracle 你只能靠自己或别人了
我原来是把mysql查出来的结果转化为了以元组为元素的列表,并把其中的 None全部转化了 '',我刚把这两步转化都取消了,确实不会报错了,但是我原来为什么要这么做我给忘了,应该跟这个 None 有关系
那个是个字符串,不是乱码
@但愿长醉丶不愿醒:
嗯,能解决问题就行(具体内部是怎样处理的,你可以断点进去看看,应该都会有 SQL 的表达式)
转换成元组列表是为了批量插入,是和 “:18” 这种占位搭配的
转换空字符,一般是给 string 类型用的,你用 pandas.Dataframe 处理会经常用到
(快 1 年没碰 Oracle 了,完全是凭印象答疑)
循环插入是不是写的过快 数据库反应不过来 给你报错 加个延时看看
应该不是循环的问题,这里报的是数据格式问题