如何将DataFrame的int64列转换为Oracle NUMBER(20,3)等价类型
DataFrame int64列插入Oracle NUMBER(20,3)字段的解决方案
你遇到的invalid identifier报错通常由两类问题导致:一是pandas int64类型和Oracle NUMBER(20,3)类型映射不匹配,二是插入时字段名、数值范围不符合目标表要求,可按以下步骤处理:
1. 转换int64列为NUMBER(20,3)等价类型
NUMBER(20,3)表示总长度20位、小数位3位、整数位17位的数值类型,你可以根据精度需求选择两种转换方式:
- 普通场景用float64转换:
# 转换int64列为float64,保留3位小数 df['目标列名'] = df['目标列名'].astype('float64').round(3)
- 高精度场景用Decimal转换(避免浮点精度丢失,推荐):
from decimal import Decimal # 转换为Decimal类型,强制保留3位小数 df['目标列名'] = df['目标列名'].apply(lambda x: Decimal(x).quantize(Decimal('0.000')))
2. 插入时显式指定类型映射
使用to_sql插入时必须手动指定列的Oracle类型,避免pandas默认映射规则出错:
from sqlalchemy import create_engine, Numeric # 初始化Oracle连接 engine = create_engine('oracle+cx_oracle://用户名:密码@主机地址:端口/服务名') # 定义类型映射,和目标表的NUMBER(20,3)完全对应 dtype_config = { "目标列名": Numeric(precision=20, scale=3) } # 执行插入 df.to_sql( name="目标表名", con=engine, if_exists="append", index=False, dtype=dtype_config )
额外排查项
如果完成上述操作后仍报invalid identifier,请检查两点:
- DataFrame的列名和Oracle目标表列名大小写完全匹配,Oracle默认不区分大小写,若建表时用双引号指定了大写列名,需将DataFrame列名同步转为大写
- 转换后的列数值没有超出NUMBER(20,3)的范围(即整数位不超过17位)
内容的提问来源于stack exchange,提问作者Alok Sharma
相关产品推荐
相关产品推荐

