You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.21 19:12:20