问题
我有一个 pandas 数据框,我正在尝试对 Oracle 数据库使用 pd.df.to_sql()
函数。我的 Oracle 数据库是 19.3c
。看起来很简单吧?为什么不起作用??
我在其他一些 stackoverflow 帖子中看到我应该使用 sqlalchemy 数据类型。好的。链接:
- Pandas and SQL Alchemy: Specify Column Data Types
- Pandas to_sql changing datatype in database table
- https://docs.sqlalchemy.org/en/14/dialects/oracle.html#oracle-data-types
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
即席并发送一系列ALTER TABLE tbl_name MODIFY col_name
相关链接:
最佳答案
事实证明,我需要仔细检查从 API 传入的数据类型到我的 pandas 数据帧中(做了一个愚蠢的假设,数据是干净的)... API 正在生成所有字符串,并使用 df.info
真的很有帮助。
需要将所有整数、数字和日期转换为 python 中适当的数据类型(这是主要问题),然后可以重新映射数据库数据类型。简而言之...
API (all strings) --> Python (set datatypes) --> Database (map datatypes using sqlalchemy)
我使用了pd.Int64Dtype()
对于具有空值的整数列,以及 'datetime64[ns]'
对于日期时间。
关于python - pandas df.to_sql到Oracle数据库数据类型不一致,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/69684936/