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

如何将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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.02 12:45:03