pandas df.to_sql与Oracle数据库数据类型不一致



问题

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

我在其他一些stackoverflow帖子中看到,我应该使用sqlalchemy数据类型。可以链接:

  • Pandas和SQL炼金术:指定列数据类型
  • Pandas to_sql更改数据库表中的数据类型
  • https://docs.sqlalchemy.org/en/14/dialects/oracle.html#oracle-数据类型
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或一些其他随机数据类型。我该怎么办?

我试过的东西

我试过了,但没有成功。。。

  • 首先tructing(从python向数据库发送SQL语句)表,然后是if_exist="append"
  • 使用if_exist="replace"
  • 仅使用sqlalchemy数据类型的Oracle特定方言
  • 仅使用通用sqlalchmey数据类型
  • 两者兼而有之,我很沮丧

也许这是Oracle特有的问题?

我没有尝试过的事情:

我没有尝试过的东西:

  • 正在删除表并在插入前重新创建它
  • CCD_ 8自组织和发送一些CCD_

相关链接:

  • 更改Oracle中列的数据类型

我需要仔细检查从API到pandas数据帧的传入数据类型(愚蠢地假设数据是干净的)。。。API正在生成所有字符串,使用df.info真的很有帮助。

需要在python中将所有整数、数字和日期转换为适当的数据类型(这是主要问题),然后可以重新映射数据库数据类型。简言之

API(所有字符串)-->Python(设置数据类型)-->数据库(使用sqlalchemy映射数据类型)

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

我在使用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()   
}

最新更新