【问题标题】:pandas df.to_sql to Oracle database datatype inconsistencypandas df.to_sql 到 Oracle 数据库数据类型不一致
【发布时间】:2026-01-08 17:15:01
【问题描述】:

问题

我有一个 pandas 数据框,我正在尝试将 pd.df.to_sql() 函数用于 Oracle 数据库。我的 Oracle 数据库是 19.3c。看起来很容易对吧?为什么它不起作用??

我在其他一些 * 帖子中看到我应该使用 sqlalchemy 数据类型。好的。链接:

from sqlalchemy.types import Integer, String
from sqlalchemy.dialects.oracle import NUMBER, VARCHAR2, DATE

oracle_dtypes = {
        'id' : NUMBER(38,0),
        'counts' : Integer,
        'name' : VARCHAR2(50),
        'swear_words' : String(9999)
        'date' : DATE()   
}

df_upload.to_sql(
    "oracle_table", 
    db.engine, 
    schema="SA_COVID", 
    if_exists="replace", 
    index=False
    dtype=oracle_dtypes
)

它将随机组转换为CLOB 或其他一些随机数据类型永远不会失败。我该怎么办?

我尝试过的事情

我试过了,还是不行……

  • 先整理(从python向数据库发送SQL语句)表然后if_exist="append"
  • 使用if_exist="replace"
  • 仅使用sqlalchemy 数据类型的 Oracle 特定方言
  • 仅使用通用sqlalchmey 数据类型
  • 同时使用这两种方法我很沮丧

也许这是 Oracle 特定的问题?

我没有尝试过的事情:

我没有尝试过的事情:

  • 删除表并在插入前重新创建它
  • to_sql adhoc 和发送一系列的一些ALTER TABLE tbl_name MODIFY col_name

相关链接:

【问题讨论】:

  • 你遇到了什么错误?
  • 是 sql alchemy 为您创建表,还是您插入到现有表中。如果后者会给你一个错误吗?你能从Oracle添加create table语句吗?

标签: python pandas oracle sqlalchemy cx-oracle


【解决方案1】:

结果我需要仔细检查从 API 传入的数据类型到我的 pandas 数据帧中(愚蠢地假设数据是干净的)......df.info 真的很有帮助。许多整数、数字和日期数据以字符串形式出现。在推送到之前必须在 pandas df 中重新定义它们

我将pd.Int64Dtype() 用于具有空值的整数列,将'datetime64[ns]' 用于日期时间。

【讨论】:

    【解决方案2】:

    我在使用df.to_sql时遇到了类似的问题

    import sqlalchemy as sa
    df_upload.to_sql(
        "oracle_table", 
        db.engine, 
        schema="SA_COVID", 
        if_exists="replace", 
        index=False
        dtype=oracle_dtypes
    )
    

    像这样改变你的数据类型:

    oracle_dtypes = {
            'id' : sa.types.NUMBER(38,0),
            'counts' : sa.types.Integer,
            'name' : sa.types.VARCHAR2(50),
            'swear_words' : sa.types.String(9999)
            'date' : sa.types.DATE()   
    }
    

    【讨论】:

    • 感谢您的意见。我在故障排除中也尝试过此方法,但看起来我的问题是其他问题