Python字符串转Oracle DATE列:executemany报错TypeError求助
解决Oracle executemany插入datetime报错的问题
核心问题分析
报错TypeError: expecting date or datetime通常源于三个常见问题:
- 日期转换时索引错误,导致部分数据仍为字符串类型
- 转换后的datetime对象带有Oracle DATE类型不支持的微秒
- 未确保目标列对应的所有数据项都是标准的
datetime.datetime对象
解决步骤与示例代码
1. 修正日期转换逻辑,遍历处理所有数据行
你提供的示例代码存在索引错误(用data[1][2]转换data[0][2]),这会导致仅单条数据被转换,其余数据仍为字符串。正确做法是遍历每一行,转换对应位置的日期字段:
import datetime import cx_Oracle # 假设listdf是原始数据列表,每个子列表对应一行,RECORD_DATE是第0个字段(对应SQL中的:1) processed_data = [] for row in listdf: # 提取日期字符串,替换成你实际的字段索引 date_str = row[0] # 转换为datetime对象,截断微秒(Oracle DATE不支持微秒) dt_obj = datetime.datetime.strptime(date_str, "%Y-%m-%d %H:%M:%S.%f").replace(microsecond=0) # 替换原行中的日期字符串为datetime对象 new_row = list(row) new_row[0] = dt_obj processed_data.append(new_row)
2. 显式指定绑定变量类型(可选,用于复杂场景)
如果仍报错,可以通过setinputsizes显式告诉Oracle驱动对应字段的类型:
# 获取游标 cursor = connection_dev.cursor() # 对应SQL中的三个参数::1指定为DATE类型,其余保持默认 cursor.setinputsizes(cx_Oracle.DB_TYPE_DATE, None, None) # 执行批量插入 sql = "insert into py_table (RECORD_DATE,TYPECOL,GMTRD) values (:1,:2,:3)" cursor.executemany(sql, processed_data) connection_dev.commit() # 关闭资源 cursor.close()
3. 适配Oracle字段类型
如果你的表列是TIMESTAMP类型(支持微秒),则无需截断微秒,直接保留转换后的datetime对象即可。
关键注意事项
- 确保所有要插入DATE/TIMESTAMP列的数据都是
datetime.datetime对象,不能是datetime.date或字符串 - Oracle DATE类型仅存储年-月-日 时:分:秒,微秒会被丢弃,转换时截断可避免类型不匹配
- 检查数据索引对应关系,确保转换的字段与SQL中的列顺序完全一致
内容的提问来源于stack exchange,提问作者Amir
相关产品推荐
相关产品推荐

