python-3.x pandas df.to_sql与Oracle数据库数据类型不一致

svmlkihl  于 2023-06-25  发布在  Python
关注(0)|答案(2)|浏览(255)

问题

我有一个pandas dataframe,我正在尝试使用pd.df.to_sql()函数到Oracle数据库。Oracle数据库是19.3c。似乎很容易吧?为什么不行??
我在其他一些stackoverflow帖子中看到,我应该使用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向db发送SQL语句),然后创建if_exist="append"
  • 使用if_exist="replace"
  • 使用Oracle特定方言sqlalchemy数据类型 * 仅 *
  • 仅使用通用sqlalchmey数据类型 *
  • 两者的混合使用只是BC我很沮丧

也许这是一个甲骨文特有的问题?

Things I haven't tried:

我没试过的东西:

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

相关链接:

aemubtdh

aemubtdh1#

原来我需要仔细检查从API传入的数据类型到我的pandas dataframe(做了一个愚蠢的假设,数据是干净的)... API生成所有字符串,使用df.info确实很有帮助。
需要将所有的整数,数字和日期转换为python中适当的数据类型(这是主要问题),并从那里可以重新Map数据库数据类型。总之...
API(所有字符串)--> Python(设置数据类型)--> Database(使用sqlalchemyMap数据类型)
我使用pd.Int64Dtype()来表示具有空值的整数列,使用'datetime64[ns]'来表示日期时间。

biswetbf

biswetbf2#

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

像这样更改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()   
}

相关问题