Python DataFrame to_sql方法插入日期或时间类型的数据时 报ORA-01861 文字与字符串不匹配 的解决方法

业务团队近期提出一个需求:

希望在接口调用之前先批量插入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)

  特此记录一下,以便下次遇到可以快速解决

原文地址:https://www.cnblogs.com/QianyuQian/p/15428091.html