业务团队近期提出一个需求:
希望在接口调用之前先批量插入Excel中的数据作为数据预置
这个需求以前已经开发完成 本来以为可以很快调试完毕
没成想遭遇一个难关
DataFrame.to_sql方法在执行过程中报ORA-01861 文字与字符串不匹配(着急解决问题,并没有来得及截图)
搞了一个下午+睡前一小时+今天上午一小时
终于弄清楚原因
业务方提供的数据格式不正确
看起来像是日期没有问题,但是是左对齐的日期,python会将其作为文本来处理
截图如下:
另外在dtype字段也做了简单处理
代码如下:
def mapping_df_types(self,df): dtypedict = {} for i, j in zip(df.columns, df.dtypes): print("df.columns的值为{}".format(i)) print("df.dtypes的值为{}".format(j)) if "date" in str(i).lower(): # 2021/10/19调试:解决ORA-01861文字与格式字符串不匹配的问题 dtypedict.update({i: DATE}) if "object" in str(j): if "time" in str(i).lower(): dtypedict.update({i: DATE}) else: dtypedict.update({i: VARCHAR(256)}) if "float" in str(j): dtypedict.update({i: NUMBER(19,8)}) # if "datetime64[ns]" in str(j): # dtypedict.update({i:DATE}) # if "int" in str(j): # dtypedict.update({i:VARCHAR(19)}) # print(dtypedict) return dtypedict
def put_df_toOracle(self, tableName, dbaddr): df = self.get_DataFrame() engine = create_engine(dbaddr, encoding='utf-8', echo=True) dtypedict = self.mapping_df_types(df) try: # 20210415增加schema参数,待验证,excel中表名需要删除schema.(info.) df.to_sql(tableName, engine, schema=self.schema_name, index=False, if_exists='append', dtype=dtypedict, chunksize=None) except Exception as e: print(e)
特此记录一下,以便下次遇到可以快速解决